![]() |
TDBGrid: Read-Only-Feld
Hallo,
ich kriegs nicht hin !!! ;( ![]() Was will ich: Ich will bei einer Spalte ein CheckBox-Feld simulieren (x=Checked). Das darunterliegende Feld ist ein String[1] eines TClientDataSets. Per Doppelklick will ich markieren/ demarkieren. AutoEdit ist auf True gesetzt. Doppelklick schaltet zwar schön um, die Zelle bleibt aber im Edit-Mode. Ich mag das TDBGrid einfach nicht ... ;)
Delphi-Quellcode:
Weiss jemand, wie ich das hinbekomme?
procedure TForm1.dbGridAssistentenCellClick(Column: TColumn);
begin inherited; if Column.Field.FieldName='markiert' then begin Column.ReadOnly := True; end; end; procedure TForm1.dbGridAssistentenDblClick(Sender: TObject); begin inherited; // Status des ClientDataSets cdAssistent prüfen if not (cdAssistent.State in [dsEdit,dsInsert]) then begin cdAssistent.Edit; end; if dbGridAssistenten.SelectedField.FieldName='markiert' then begin if dbGridAssistenten.SelectedField.AsString='' then begin dbGridAssistenten.SelectedField.AsString := 'x'; end else begin dbGridAssistenten.SelectedField.AsString := ''; end; cdAssistent.Post; end; end; |
AW: TDBGrid: Read-Only-Feld
Weil diese Bedingung nicht erfüllt ist:
Delphi-Quellcode:
Du machst es im DblClick-Ereignis des DBGrids. Das bedeutet nicht, dass das betroffene Feld auch selektiert ist. Aber genau das prüfst du mit deiner Bedingung. Vorher machst du ein Edit, aber du kommst nicht zum Post.
if dbGridAssistenten.SelectedField.FieldName='markiert' then
|
AW: TDBGrid: Read-Only-Feld
Hallo,
der Breakpoint wird aber angesprungen. Bis dahin ist alles OK. Es liegt wohl am AutoEdit. Das wird später ausgewertet. Ich denke, ich ärgere mich nicht rum und benutze das TMS-TAdvDBGrid, das murkst hier nicht so rum. PS: Aber vielleich an anderer Stelle. Heiko |
AW: TDBGrid: Read-Only-Feld
Col.SetReadOnly > Grid.InvalidateCol scheint wohl nur die Anzeige/Grafik, aber nicht den ReadOnly-Status zu aktualisieren.
Delphi-Quellcode:
procedure TForm1.dbGridAssistentenCellClick(Column: TColumn);
begin if Column.Field.FieldName='markiert' then Column.ReadOnly := True; end; procedure TForm1.dbGridAssistentenDblClick(Sender: TObject); begin //if not (cdAssistent.State in [dsEdit,dsInsert]) then // Edit macht eh nichts, wenn es schon im Edit/Insert-Modus ist cdAssistent.Edit; if dbGridAssistenten.SelectedField.FieldName='markiert' then // was wohl passiert, wenn kein Feld markiert währe? begin if dbGridAssistenten.SelectedField.AsString='' then dbGridAssistenten.SelectedField.AsString := 'x' else dbGridAssistenten.SelectedField.AsString := ''; cdAssistent.Post; // hier das Grid dazu bringen den "Eingabe"-Modus zu beenden end; end;
Delphi-Quellcode:
: ReadOnly wird bestimmt schon beim ColumChange ausgewertet,
Coumn.ReadOnly := True;
aber warum erst beim Click setzen und nicht gleich im FormCreate, beim Laden der Daten oder nach Erstellen der Gridspalten?
Delphi-Quellcode:
speichert nur das DataSet, aber das DataSet hat nichts mit dem Grid zu tun, bzw. die beiden "EDIT" sind nicht das Selbe/Gleiche.
cdAssistent.Post;
Das DataSet wird (automatisch) erst bei einer Wert-Änderung in den Editmodus versetzt und die Zelle ist schon vorher unabhängig in ihrem EditEingabeModus. Du könntest es mit den Protected-Methoden Grid.InvalidateEditor und Grid.ShowEditor versuchen, welche den InplaceEditor aktualisieren. (Grid.UpdateEdit) |
AW: TDBGrid: Read-Only-Feld
Hallo,
so die Lösung! Man, war das ein Rumwürgen. Aber vielleicht hat ja jemand ein ähnliches Problem. PS: Das das doppelter Code ist, ist klar. War nur ein Beispiel-Projekt. Heiko
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin cdAssistent.CreateDataSet; // geht natürlich auch Im Objekt-Inspector dbGridAssistenten.Options := dbGridAssistenten.Options-[dgEditing]; dbGridAssistenten.Columns[0].ReadOnly := True; end; procedure TForm1.dbGridAssistentenKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if dbGridAssistenten.SelectedField.FieldName='markiert' then begin dbGridAssistenten.Options := dbGridAssistenten.Options-[dgEditing]; end else begin dbGridAssistenten.Options := dbGridAssistenten.Options+[dgEditing]; end; end; procedure TForm1.dbGridAssistentenCellClick(Column: TColumn); begin if dbGridAssistenten.SelectedField.FieldName='markiert' then begin dbGridAssistenten.Options := dbGridAssistenten.Options-[dgEditing]; end else begin dbGridAssistenten.Options := dbGridAssistenten.Options+[dgEditing]; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz