Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   TDBGrid: Read-Only-Feld (https://www.delphipraxis.net/189764-tdbgrid-read-only-feld.html)

hoika 18. Jul 2016 13:37

TDBGrid: Read-Only-Feld
 
Hallo,
ich kriegs nicht hin !!! ;(

http://stackoverflow.com/questions/2...cell-in-delphi

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:
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;
Weiss jemand, wie ich das hinbekomme?

Jasocul 18. Jul 2016 15:13

AW: TDBGrid: Read-Only-Feld
 
Weil diese Bedingung nicht erfüllt ist:
Delphi-Quellcode:
if dbGridAssistenten.SelectedField.FieldName='markiert' then
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.

hoika 18. Jul 2016 21:34

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

himitsu 19. Jul 2016 12:35

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:
Coumn.ReadOnly := True;
: ReadOnly wird bestimmt schon beim ColumChange ausgewertet,
aber warum erst beim Click setzen und nicht gleich im FormCreate, beim Laden der Daten oder nach Erstellen der Gridspalten?


Delphi-Quellcode:
cdAssistent.Post;
speichert nur das DataSet, aber das DataSet hat nichts mit dem Grid zu tun, bzw. die beiden "EDIT" sind nicht das Selbe/Gleiche.
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)

hoika 21. Jul 2016 09:32

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 21:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz