AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TDBGrid: Read-Only-Feld

Ein Thema von hoika · begonnen am 18. Jul 2016 · letzter Beitrag vom 21. Jul 2016
Antwort Antwort
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#1

TDBGrid: Read-Only-Feld

  Alt 18. Jul 2016, 14:37
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='markiertthen
  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='markiertthen
  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?
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.354 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TDBGrid: Read-Only-Feld

  Alt 18. Jul 2016, 16:13
Weil diese Bedingung nicht erfüllt ist:
if dbGridAssistenten.SelectedField.FieldName='markiertthen 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.
Peter
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: TDBGrid: Read-Only-Feld

  Alt 18. Jul 2016, 22:34
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
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#4

AW: TDBGrid: Read-Only-Feld

  Alt 19. Jul 2016, 13:35
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='markiertthen
    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='markiertthen // 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;
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?


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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (19. Jul 2016 um 13:43 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: TDBGrid: Read-Only-Feld

  Alt 21. Jul 2016, 10:32
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='markiertthen
  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='markiertthen
  begin
    dbGridAssistenten.Options := dbGridAssistenten.Options-[dgEditing];
  end
  else
  begin
    dbGridAssistenten.Options := dbGridAssistenten.Options+[dgEditing];
  end;
end;
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:11 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