Autor Beitrag
ralph
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57

openSUSE 10.3 mit Crossover Linux 6.2
Delphi 3 Pro, Freereport 2.32
BeitragVerfasst: Mo 27.02.06 18:19 
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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 27.02.06 18:23 
Einfach OnClick := DeinMethodenName;

Wenn Du also eine Methode ExtraButtonsOnClick hast, würde diese mit OnClick := ExtraButtonsOnClick; zugewiesen wwerden.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
rd3
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 27.02.06 18:24 
Hallo,

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57

openSUSE 10.3 mit Crossover Linux 6.2
Delphi 3 Pro, Freereport 2.32
BeitragVerfasst: 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.

ausblenden 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:

ausblenden 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 !

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 374

WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
BeitragVerfasst: 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
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57

openSUSE 10.3 mit Crossover Linux 6.2
Delphi 3 Pro, Freereport 2.32
BeitragVerfasst: 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 www.delphi-forum.de/....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