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

// DBMemo1.DataField := Feldname;

Button := TButton.Create(Self);

with Button do

begin

Parent := FRM_Main;

Caption:='Zeige Memo';

Width := 150;

Left := Feld.Left + 150;

Top := Feld.Top;

// Wie kann ich im dynamisch erzeugten Button eine Prozedur mit dem Ereignis OnClick aufrufen ?

// OnClick := ??? ; funktioniert nicht

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
// Anweisungen
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

// DBMemo1.DataField := Feldname;

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

// sucht nach Name

Feld := TDBEdit(FindComponent('Feld_' + IntToStr(i)));

// entfernt Komponente

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; //--MemoInhalt mit Inhalt aus dem TabellenFeld füllen
 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