View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0001778 | JEDI VCL | 00 JVCL Components | public | 2004-05-17 05:31 | 2004-09-03 14:37 |
Reporter | yuri | Assigned To | AHUser | ||
Priority | normal | Severity | minor | Reproducibility | always |
Status | resolved | Resolution | fixed | ||
Product Version | |||||
Target Version | Fixed in Version | ||||
Summary | 0001778: JvDBGrid bug in KeyPress procedure with lookup fields | ||||
Description | BUG1:I use a lookup field and type in a column of the lookup field some text. I receive an error "Operation not applicable" if the length of the text in a cell is equal to the size of the field and I press one more key. It happened in KeyPress procedure of TJvDBGrid in the follow line "if LookupDataSet.Locate(LookupResultField, lWord, [loCaseInsensitive, loPartialKey]) then" The locate does not accept the length of the search text more than the size of the field of the search (the length of lWord must be less or equal to the size of the field). BUG2: Also there is no check whether the column is ReadOnly (need to check Columns[SelectedIndex].ReadOnly and do not change the field value if Columns[SelectedIndex].ReadOnly=True). BUG3: And it will be useful if we can change the set of char declared in cChar const (in KeyPress procedure), because it does not contain all available characters for string field and as a result the selection of the the value "when the user types the first characters of a word found in the list" work only for english set of chars. | ||||
Additional Information | I correct the code to solve the described bugs (see upload file). | ||||
Tags | No tags attached. | ||||
2004-05-17 05:31
|
upload1.txt (4,090 bytes)
Changes in TJvDBGrid TJvDBGrid = class(TJvExDBGrid) private .. protected .. procedure InternalKeyPress(var Key: Char; AChar: TFieldChars); virtual; function SelectCell(ACol, ARow: Integer): overload; public .. end; procedure TJvDBGrid.KeyPress(var Key: Char); const cChar = ['A'..'Z', 'a'..'z', ' ', '-', '+', '0'..'9', '.', ',', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', '�', #8]; begin // Remark: InplaceEditor is protected in TCustomGrid, published in TJvDBGrid // Goal: Allow to go directly into the InplaceEditor when one types the first // characters of a word found in the list. if not ReadOnly then if (Key = #13) and FPostOnEnter then DataSource.DataSet.CheckBrowseMode else if not(Columns[SelectedIndex].ReadOnly) then InternalKeyPress(Key,cChar); if EditorMode then inherited OnKeyPress := FOnKeyPress; try inherited KeyPress(Key); finally inherited OnKeyPress := nil; end; end; procedure TJvDBGrid.InternalKeyPress(var Key: Char; AChar: TFieldChars); var lWord: string; lMasterField: TField; I, deb: Integer; begin with Columns[SelectedIndex].Field do if FieldKind = fkLookup then begin if (Key in AChar) then begin if Pos(AnsiUpperCase(FWord), AnsiUpperCase(InplaceEditor.EditText)) <> 1 then FWord := ''; if Key = #8 then if (FWord = '') or (Length(FWord) = 1) then begin lWord := ''; FWord := ''; end else lWord := Copy(FWord, 1, Length(FWord) - 1) else lWord := FWord + Key; LookupDataSet.DisableControls; try try if LookupDataSet.Locate(LookupResultField, lWord, [loCaseInsensitive, loPartialKey]) then begin DataSet.Edit; lMasterField := DataSet.FieldByName(KeyFields); if lMasterField.CanModify then begin lMasterField.Value := LookupDataSet.FieldValues[LookupKeyFields]; FWord := lWord; InplaceEditor.SelStart := Length(FWord); InplaceEditor.SelLength := Length(InplaceEditor.EditText) - Length(FWord); end; end; except { If you attempt to search for a string larger than what the field can hold, and exception will be raised. Just trap it } end; finally LookupDataSet.EnableControls; end; end; end else if FieldKind = fkData then begin if DataType = ftFloat then if Key in ['.', ','] then Key := DecimalSeparator; if (Key in AChar) and (Columns[SelectedIndex].PickList.Count <> 0) then begin if Pos(AnsiUpperCase(FWord), AnsiUpperCase(InplaceEditor.EditText)) <> 1 then FWord := ''; if Key = #8 then if (FWord = '') or (Length(FWord) = 1) then begin lWord := ''; FWord := ''; end else lWord := Copy(FWord, 1, Length(FWord) - 1) else lWord := FWord + Key; Key := #0; // De toute fa�on le caract�re est supprim� with Columns[SelectedIndex].PickList do for I := 0 to Count - 1 do begin deb := Length(lWord); if AnsiUpperCase(lWord) = AnsiUpperCase(Copy(Strings[I], 1, deb)) then begin DataSet.Edit; InplaceEditor.EditText := Strings[I]; Columns[SelectedIndex].Field.Text := Strings[I]; InplaceEditor.SelStart := deb; InplaceEditor.SelLength := Length(Text) - deb; FWord := lWord; Break; end; end; end; end; end; function TJvDBGrid.SelectCell(ACol, ARow: Integer): Boolean; begin FWord:=''; Result:=inherited SelectCell(ACol, ARow); end; |
|
JvDBGrid will probably be merged with recently donated UltimDbGrid soon, so I don't think we will see any fixes before that |
|
Bug 1 could not be reproduced, could you give us more details, after having tried with the latest code. Bug 2 and 3 are now fixed in CVS To get the latest code, use the daily zip packages of both the JCL and JVCL: http://jvcl.sf.net/daily/ http://jcl.sf.net/daily/ edited on: 08-05-04 23:09 |
|
BUG1: this sounds more like a problem with the dataset. What type of dataset are you using? |
2004-08-16 00:17
|
test.exe (387,195 bytes) |
|
I uploaded an example test.exe with BUG1. This archive contains the example project and the img1.bmp file with the description how to see the error. In my upload1.txt I suggest trap this bug with "try ... except end" =====start ... try if LookupDataSet.Locate(LookupResultField, lWord, [loCaseInsensitive, loPartialKey]) then begin DataSet.Edit; lMasterField := DataSet.FieldByName(KeyFields); if lMasterField.CanModify then begin lMasterField.Value := LookupDataSet.FieldValues[LookupKeyFields]; FWord := lWord; InplaceEditor.SelStart := Length(FWord); InplaceEditor.SelLength := Length(InplaceEditor.EditText) - Length(FWord); end; end; except { If you attempt to search for a string larger than what the field can hold, and exception will be raised. Just trap it } end; ... ====end In TDBLookupControl.ProcessSearchKey Borland solve the problem with the same way |
|
Also, it would be better to change UpperCase to AnsiUpperCase in CharsToFind procedure; if Pos(UpperCase(FWord), UpperCase(InplaceEditor.EditText)) <> 1 then change to if Pos(AnsiUpperCase(FWord), AnsiUpperCase(InplaceEditor.EditText))<>1 then ^^^^^^^^^^^^^ ^^^^^^^^^^^^^^ |
|
Bug 1, 2 and 3 are now fixed. |
Date Modified | Username | Field | Change |
---|---|---|---|
2004-05-17 05:31 | yuri | New Issue | |
2004-05-17 05:31 | yuri | File Added: upload1.txt | |
2004-05-24 00:29 |
|
Note Added: 0004331 | |
2004-05-24 01:18 |
|
Status | new => acknowledged |
2004-08-05 23:08 | obones | Note Added: 0004940 | |
2004-08-05 23:08 | obones | Status | acknowledged => feedback |
2004-08-05 23:09 | obones | Note Edited: 0004940 | |
2004-08-05 23:16 |
|
Note Added: 0004944 | |
2004-08-16 00:17 | anonymous | File Added: test.exe | |
2004-08-16 00:31 | anonymous | Note Added: 0004998 | |
2004-08-16 00:55 | yuri | Note Added: 0004999 | |
2004-09-03 14:37 | AHUser | Status | feedback => resolved |
2004-09-03 14:37 | AHUser | Resolution | open => fixed |
2004-09-03 14:37 | AHUser | Assigned To | => AHUser |
2004-09-03 14:37 | AHUser | Note Added: 0005168 |