Entwickler-Ecke
Datenbanken - Zur Laufzeit Button OnClick Ereignis zuweisen;
ralph - Mo 27.02.06 18:19
Titel: Zur Laufzeit Button OnClick Ereignis zuweisen;
In meinem dbmaker wird mit F7 vom Tabellenlayout in das Formularlayout umgeschaltet. DBGrid.Visible wird auf False gesetzt und dann werden alle Datenbankfelder in einer Schleife dynamisch erzeugt und im leeren Formular untereinander angeordnet. Wenn er bei einem Feld den Datentyp FtMemo ermittelt, soll neben dem Memofeld dynamisch ein Button erzeugt werden, mit dem man durch ein OnClick Ereignis ein Fenster mit dem Memoinhalt anzeigen kann.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| If Feldtype = ftMemo then
begin
Button := TButton.Create(Self);
with Button do
begin
Parent := FRM_Main;
Caption:='Zeige Memo';
Width := 150;
Left := Feld.Left + 150;
Top := Feld.Top;
end;
end; |
Der Button wird auch an der richtigen Stelle neben dem Memofeld erzeugt, aber bei einem Klick passiert nichts !
Hier fehlt mir die Erfahrung, das habe ich noch nie gemacht und ich habe auch noch kein Beispiel gefunden.
Ralli
BenBE - Mo 27.02.06 18:23
Einfach OnClick := DeinMethodenName;
Wenn Du also eine Methode ExtraButtonsOnClick hast, würde diese mit OnClick := ExtraButtonsOnClick; zugewiesen wwerden.
Delete - Mo 27.02.06 18:24
Hallo,
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure ButtonClick(sender: tobject); ... private ...
implementation
procedure Tform1.ButtonClick(Sender: tobject); begin end;
procedure TForm1.onCreate(sender: tobject); begin Button1.onclick := ButtonClick; end; |
gruß
rd3
ralph - Di 28.02.06 08:42
Titel: Und so funktioniert es (vorläufig)
Ja ich habe die Procedur noch leicht geändert, denn es können ja auch x Memofelder in einem Dataset vorhanden sein.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| If Feldtype = ftMemo then
begin
Button := TButton.Create(Self);
with Button do
begin
Parent := FRM_Main;
Caption:='Zeige Memo';
Width := 150;
Left := Feld.Left + 150;
Top := Feld.Top;
Name := 'Button_' + IntToStr(i);
OnClick := ButtonClicK;
end;
end; |
Bei einem Klick auf einen der Buttons wird immer die gleiche Routine aufgerufen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TFRM_Main.ButtonClick(Sender: tobject); begin
FRM_Memo.ShowModal;
end; |
Und nicht vergessen beim Wechsel vom Formularmodus in den Tabellenmodus alle dynamisch erzeugten Kompos wieder zu entfernen !
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| procedure TFRM_Main.form_clear;
var I : Integer;
var DBLabel : TLabel; var Feld : TDBEdit; var Button : TButton;
begin
If Tabelle.Active then
begin
for i := 0 to Tabelle.FieldCount -1 do
begin
Feld := TDBEdit(FindComponent('Feld_' + IntToStr(i)));
Feld.Free;
DBLabel := TLabel(FindComponent('Label_' + IntToStr(i)));
DBLabel.Free;
Button := TButton(FindComponent('Button_' + IntToStr(i)));
Button.Free;
end;
end;
end; |
Aber das ist ja wirklich erst die halbe Miete, denn wie kann ich den Feldnamen des Memofeldes an das Formular
FRM_Memo.ShowModal übergeben, so das immer der Inhalt des richtigen Memofeldes angezeigt wird, denn es können ja mehrere Memofelder vorhanden sein ! Ja, ich bin im Augenblick im Lernmodus, aber spannend ist es allemal.
Danke an Alle, die mir bisher weitergeholfen haben.
Ralli
raiguen - Di 28.02.06 12:17
Moin :-)
Denkanstoß:
Beim dynamischen Erzeugen der FeldAnzeigeKomponenten (bei Dir TDBEdit) abfragen, ob FeldTyp ein Memo ist. Wenn ja, dann erzeuge kein TDBEdit sondern ein TDBMemo. Höhe und Breite den TDBEdit.Komonenten anpassen. Als weitere Eigenschaft für ein TDBMemo kannst Du AutoDisplay auf TRUE setzen-->Inhalt des Memos wird sofort angezeigt, bei AutoDisplay := FALSE steht nur der Feldname in der zugrunde liegenden Tabelle.
Anregung: AnzeigeButton nur dann createn wenn das MemoFeld nicht leer ist ;-)
In der Routine procedure TFRM_Main.form_clear als weitere Variable FeldM: TDBMemo deklarieren und die 'Freigabe' analog TDBEdit einbauen.
So, nun zur Anzeige des MemoInhaltes:
Ich gehe davon aus, dass das Formular FRM_Memo bereits irgendwo created wurde!?
Dann probier folgendes:
Auf dem Formular ein ganz normales TMemo plazieren
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TFRM_Main.ButtonClick(Sender: tobject); begin FRM_Memo.Memo1.Lines := Feldxyz.Lines; FRM_Memo.ShowModal;
end; |
Gruß
ralph - Di 28.02.06 23:23
Titel: Jetzt läuft es ohne Buttons
Moin :D
habe auf die Erzeugung der Buttons für die Anzeige der Memofelder verzichtet und den Code geändert, der im Thread
http://www.delphi-forum.de/viewtopic.php?p=339416#339416 nachzuvollziehen ist.
Auch für meinen dbmaker (mit Absolute Database Kern) funktioniert nun die Einzelsatzdarstellung im Formularmodus.
Und ich habe gelernt, wie Buttons mit OnClick Ereignis dynamisch generiert werden.
Danke für die hilfreichen Denkanstöße :idea:
So, Feierabend 16 Std. waren genug. :D
Ralli
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!