AGB  ·  Datenschutz  ·  Impressum  







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

DBGrid - onclick

Ein Thema von julchen · begonnen am 6. Aug 2025 · letzter Beitrag vom 8. Aug 2025
Antwort Antwort
julchen

Registriert seit: 20. Mär 2008
117 Beiträge
 
Delphi 10.3 Rio
 
#1

DBGrid - onclick

  Alt 6. Aug 2025, 07:49
Datenbank: MS SQL Server • Version: 22 • Zugriff über: Ado
Hallo,

ich frage Daten aus einem MS SQL-Server an.
Bestimmte Datensätze muss ich nachträglich noch anpassen, weil ich die Daten aus einem anderen System importiere und dann per copy und paste in meine Anwendung einfüge.

Die Personen, bei deinen ich noch Änderungen vornehmen lassen möchte, habe ich zur Auswahl in einem DBGrid.

Wenn ich auf die jeweilige Person klicke, werden mir die Felder zum Bearbeiten in den DB Komponenten angezeigt.
Soweit alles in Ordnung.

Ich habe einen Feldnamen 'pruefer' der je nach Geschlecht den Wert Prüfer:/Prüferin: enthält.
Die Rolle pruefer würde ich gerne erweitern auf 'Protokollant:/Protokollantin:'

Bei DBGrid gibt es aber kein onclick Ereignis, sondern nur ein OnDblClick und OnEnter ... die mir bis jetzt geholfen haben.

Wenn ich also die Person ausgewählt habe, muss ich zweimal klicken, damit mir der Wert zur Radiogroup übergeben wird, um ihn dann ggf. zu ändern.

Ich will eigentlich nicht dazu schreiben müssen, bei der Rolle Prüfer aber bitte doppelt klicken!

Warum gibt es kein onclick Ereignis oder hat jemand eine Idee, wie ich das Problem umgehen kann?

Hier meine kümmerlichen Versuche, den db gespeicherten String zu extrahieren, damit ich damit weiterarbeiten kann:

Code:
// Rückgabe von Auswahl DBGRid3  läuft nicht!
procedure TForm1.DBGRid3OnDblClick(Sender: TObject);
var
     a: string;
     s: string;
begin
    // Edit1.Clear;
   //Passiert nichts  DBEdit7.Text := Edit1.Text;
   // Fehlermeldung DBEdit7.Field.AsString := Edit1.Text;
    // DBEdit7.DataField.Copy(DBEdit7.Text);

    //  DBEdit7.Text := Label9.Caption;

     a := 'Hallo';
     Label10.Caption := 'Hallo Label var a bei dbgridonclick -> onenter';

    // Fehlermeldung DBEdit7.Field.Text := Label9.Caption;

    // passiert nichts DBEdit7.TextHint := Label9.Caption;

   // passiert nichts DBEdit7.EditText := Label9.Caption;
{
   DBEdit7.SelectAll;
   DBEdit7.CopyToClipboard;
   Edit1.PasteFromClipboard;
   Clipboard.Clear;
   Edit1.Clear;
}
 //  s := DBGrid3.SelectedField.AsString;

     if DBEdit7.Text = 'Prüfer:'       then RadioGroup1.ItemIndex := 0
else if DBEdit7.Text = 'Prüferin:'     then RadioGroup1.ItemIndex := 1
else if DBEdit7.Text = 'Protokollantin:'then RadioGroup1.ItemIndex := 2
else if DBEdit7.Text = 'Protokollant:' then RadioGroup1.ItemIndex := 3
end;
VG
Kollegin: Am Wochenende wird mein PC immer langsamer! Liegt das am Strom?
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
699 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: DBGrid - onclick

  Alt 6. Aug 2025, 08:21
Ist das TDataSet hinter dem Grid im Edit Modus?
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
794 Beiträge
 
#3

AW: DBGrid - onclick

  Alt 6. Aug 2025, 08:57
https://docwiki.embarcadero.com/Libr...id.OnCellClick

???
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: DBGrid - onclick

  Alt 6. Aug 2025, 09:33
Joar, Delphi-Referenz durchsuchenTDBGrid.OnCellClick wäre bestimmt eine passende Alternative.


Per se gibt es OnClick, aber es wurde wohl einfach nur vergessen sichtbar zu machen. (ist halt nur noch protected und sollte auch funktionieren, denn im TDrawGrid gibt's das erwartungsgemäß)

Liese sich per Code einfach zuweisen
Delphi-Quellcode:
type
  TDBGrid = class(Vcl.DBGrids.TDBGrid)
  published
    property OnClick;
  end;

  TForm2 = class(TForm)
    DBGrid1: TDBGrid;
    procedure FormCreate(Sender: TObject);
  private
    procedure DBGrid1Click(Sender: TObject);
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.DBGrid1Click(Sender: TObject);
begin
  ShowMessage('blub');
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  DBGrid1.OnClick := DBGrid1Click;
end;
oder die "böse" Variante
Delphi-Quellcode:
type
  TForm2 = class(TForm)
    DBGrid1: TDBGrid;
    procedure FormCreate(Sender: TObject);
  private
    procedure DBGrid1Click(Sender: TObject);
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.DBGrid1Click(Sender: TObject);
begin
  ShowMessage('blub');
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  TDrawGrid(DBGrid1).OnClick := DBGrid1Click;
end;
oder man macht es sich selbst
Delphi-Quellcode:
type
  TDBGrid = class(Vcl.DBGrids.TDBGrid)
  protected
    procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
  end;

  TForm2 = class(TForm)
    DBGrid1: TDBGrid;
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TDBGrid.WMLButtonUp(var Message: TWMLButtonUp);
begin
  inherited;
  if ClientRect.Contains(SmallPointToPoint(Message.Pos)) then
    ShowMessage('blub');
end;
eigentlich genauer so, aber geht auch ohne (siehe drüber)
Delphi-Quellcode:
procedure TDBGrid.WMLButtonUp(var Message: TWMLButtonUp);
var
  Clicked: Boolean;
begin
  Clicked := csClicked in ControlState;
  inherited;
  if Clicked and ClientRect.Contains(SmallPointToPoint(Message.Pos)) then
    ShowMessage('blub');
end;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 6. Aug 2025 um 09:40 Uhr)
  Mit Zitat antworten Zitat
julchen

Registriert seit: 20. Mär 2008
117 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: DBGrid - onclick

  Alt 8. Aug 2025, 13:58
Hallo,

erst mal DANKE für die Erkenntnis von onclick.
Ich wußte nicht, dass man "so einfach" ein neues Ereignis schreiben kann.

Der Wechsel der Daten hat dann Funktioniert beim ersten Klick.
Danach sind die Werte in der RadioGroup nicht aktualisert worden, wenn Datensatz und Grid den Fokus wechseln.

ChatGpt hat mir dafür eine ganz andere Lösung geschrieben, die die Werte bei jedem Klick auf einen anderen Datensatz aktualisiert:

Code:
procedure TForm1.DataSource2DataChange(Sender: TObject; Field: TField);
var
  wert: string;
begin
  if not Assigned(DataSource2.DataSet) then Exit;
  if not DataSource2.DataSet.Active then Exit;

  wert := DataSource2.DataSet.FieldByName('pruefer').AsString;

  if (Field = nil) or (Field.FieldName = 'pruefer') then
  begin
    if wert = 'Prüfer:' then
      RadioGroup1.ItemIndex := 0
    else if wert = 'Prüferin:' then
      RadioGroup1.ItemIndex := 1
    else if wert = 'Protokollantin:' then
      RadioGroup1.ItemIndex := 2
    else if wert = 'Protokollant:' then
      RadioGroup1.ItemIndex := 3
    else
      RadioGroup1.ItemIndex := -1;
  end;
end;

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
 case RadioGroup1.ItemIndex of
    0: DataSource2.DataSet.FieldByName('pruefer').AsString := 'Prüfer:';
    1: DataSource2.DataSet.FieldByName('pruefer').AsString := 'Prüferin:';
    2: DataSource2.DataSet.FieldByName('pruefer').AsString := 'Protokollantin:';
    3: DataSource2.DataSet.FieldByName('pruefer').AsString := 'Protokollant:';
  end;
end;
Bis dann ...
Kollegin: Am Wochenende wird mein PC immer langsamer! Liegt das am Strom?
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.460 Beiträge
 
Delphi 12 Athens
 
#6

AW: DBGrid - onclick

  Alt 8. Aug 2025, 15:59
Moin...

Delphi-Quellcode:
case RadioGroup1.ItemIndex of
    0: DataSource2.DataSet.FieldByName('pruefer').AsString := 'Prüfer:';
    1: DataSource2.DataSet.FieldByName('pruefer').AsString := 'Prüferin:';
    2: DataSource2.DataSet.FieldByName('pruefer').AsString := 'Protokollantin:';
    3: DataSource2.DataSet.FieldByName('pruefer').AsString := 'Protokollant:';
  end;
In diesen Falle würde ich die "Strings" nicht in der Datenbank speichern sondern eine Enumeration, quasi ein Integer, ablegen. Wenn der Gesetzgeber meint, der "Prüfer" heißt ab sofort "Prüfer mit gelben Socken" tangiert das die Datenbank nicht. Der Enum Wert ist der gleiche.
https://docwiki.embarcadero.com/RADS...Typen_(Delphi)
Delphi-Quellcode:
RadioGroup1.ItemIndex := DataSource2.DataSet.FieldByName('AuditorEnumID').AsInteger;
..
Beispiele:
Delphi-Quellcode:
type
  TSound = (tsClick, tsClack, tsClock);
  TMyColor = (mcRed, mcBlue, mcGreen, mcYellow, mcOrange);
  Answer = (ansYes, ansNo, ansMaybe)
...
// wenn die Texte benötigt werden (Ausgaben, Listen)
  conDocFolderNames: array[0..5] of string = ('Documentation', 'Manuals', 'Drawings', 'Miscellaneous', 'Images', 'Correspondence'); // die Texte zur Enumeration
...
  edtText.Text := conDocFolderNames[0];

Geändert von haentschman ( 8. Aug 2025 um 16:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: DBGrid - onclick

  Alt 8. Aug 2025, 16:59
erst mal DANKE für die Erkenntnis von onclick.
Ich wußte nicht, dass man "so einfach" ein neues Ereignis schreiben kann.
"neu" ist das nicht.

Durch property OnClick; (ohne : Typ; ) wird nur die Sichtbarkeit eines vorhandenen Property verschoben,
hier von protected zu published. (public hätte aber auch gereicht)

OnClick ist in einem Vorfahren drin, aber weil es "versteckt" ist, kann es nicht direkt genutzt werden.
(entweder den Typ überschreiben oder hart Casten)

Will man das Property aber auch im ObjektInspector/FormDesigner nutzen, dann muß man seine Ableitung in der Delphi-IDE registrieren.

Beim procedure WMLButtonUp...; message WM_LBUTTONUP; wird das neu deklariert,
aber weil es im Vorfahren auch schon soetwas gibt, darf das inherited nicht fehlen.
(nicht via override überschrieben, da nicht virtual oder dynamic)

Alternativ kann man auch WndProc überschreiben (override), wo alle Messages durchgehn.
Ein Therapeut entspricht 1024 Gigapeut.
  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 20:26 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