vererbung eines TPanel's?
vererbung eines TPanel's?
Hallo zusammen,
also nun geht es endlich los.
Ich will mich nun Tiefer in das Thema vererbung einarbeiten.
Auf einer Form habe ich ein TPanel
dieses hat zwei Edit Felder und ein Label drauf.
dieses Panel (Panel1) möchte ich gerne n mal zur Programmlaufzeit erzeugen
a wie mache ich das?
b wie halte ich die einzelnen Kinder (?) auseinander?
VG,
Igor
also nun geht es endlich los.
Ich will mich nun Tiefer in das Thema vererbung einarbeiten.
Auf einer Form habe ich ein TPanel
dieses hat zwei Edit Felder und ein Label drauf.
dieses Panel (Panel1) möchte ich gerne n mal zur Programmlaufzeit erzeugen
a wie mache ich das?
b wie halte ich die einzelnen Kinder (?) auseinander?
VG,
Igor
-
- Beiträge: 6207
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: vererbung eines TPanel's?
Suchst du so was ?
Oder willst du eine neue Komponente schreiben, welche die Edit und Labels auf einem Panel haben ?
Oder willst du eine neue Komponente schreiben, welche die Edit und Labels auf einem Panel haben ?
Code: Alles auswählen
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
Panel: TPanel;
Edit: TEdit;
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
Panel := TPanel.Create(Self);
with Panel do begin
Parent := Self;
end;
Edit := TEdit.Create(Self);
with Edit do begin
Edit.Parent := Panel;
Left := 10;
Top := 10;
end;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: vererbung eines TPanel's?
joar
das geht genau in die Richtung
aber wenn ich nun auf ein Panel klicke
woher weiß ich auf welches ich geklickt habe?
lg, Igor
das geht genau in die Richtung
aber wenn ich nun auf ein Panel klicke
woher weiß ich auf welches ich geklickt habe?
lg, Igor
Re: vererbung eines TPanel's?
TT73GP7 hat geschrieben:das geht genau in die Richtung
Das Beispiel hat aber mit Vererbung nichts zu tun.
TT73GP7 hat geschrieben:aber wenn ich nun auf ein Panel klicke
woher weiß ich auf welches ich geklickt habe?
Dafür ist der Parameter "Sender" da,
- gladio
- Beiträge: 217
- Registriert: Sa 21. Jun 2014, 06:15
- OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
- CPU-Target: 64Bit
- Wohnort: Rügen
Re: vererbung eines TPanel's?
Abgesehen vom praktischen Nutzen...
Man könnte ein Label auf das Panel platzieren und der Caption des Labels den Wert eines Zählers zuordnen (ich nehme an du willst die Panele in einer Schleife erzeugen)
Die Label.Caption lässt sich dann leicht auslesen und das jeweilige Panel bestimmen. Das Label muß dazu auch nicht sichtbar sein.
Man könnte ein Label auf das Panel platzieren und der Caption des Labels den Wert eines Zählers zuordnen (ich nehme an du willst die Panele in einer Schleife erzeugen)
Die Label.Caption lässt sich dann leicht auslesen und das jeweilige Panel bestimmen. Das Label muß dazu auch nicht sichtbar sein.
-
- Beiträge: 6207
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: vererbung eines TPanel's?
joar
das geht genau in die Richtung
aber wenn ich nun auf ein Panel klicke
woher weiß ich auf welches ich geklickt habe?
Suchst du etwas in dieser Richtung ?
Man könnte ein Label auf das Panel platzieren und der Caption des Labels den Wert eines Zählers zuordnen (ich nehme an du willst die Panele in einer Schleife erzeugen)
Anstelle der Caption, würde ich "Tag" verwenden.
- Dateianhänge
-
- Button_Array.zip
- (126.91 KiB) 107-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: vererbung eines TPanel's?
hmm ok
das muss ich mal durchprobieren
klingt garnicht so schlecht das auf diese art und weise zumachen
das muss ich mal durchprobieren
klingt garnicht so schlecht das auf diese art und weise zumachen
- kupferstecher
- Beiträge: 422
- Registriert: Do 17. Nov 2016, 11:52
Re: vererbung eines TPanel's?
'Tag' sollte man eigentlich nicht verwenden, ist eher unschön und sollte nur in der Not gemacht werden (Lesbarkeit).
Du kannst bei der Erzeugung schon eine beliebige Methode (aber mit passenden Funktions-Argumenten) zuweisen:
Die Funktion wird in einer (beliebigen*) Klasse folgendermaßen Definiert:
Das Argument (Sender: TObject) ist obligatorisch und variiert je nach zugeordnetem Ereignis. Die nötigen Parameter finden sich in der Doku oder du kannst auch im Objektinspektor für ein gleiches Control ein Eventhandler erzeugen lassen und die Funktions-Argumente dort abschauen.
*Da es sich um eine Methode habdelt, die Instanz der Klasse also mitgeliefert wird, bietet sich es an, die Prozedur in der übergeordneten Klasse zu definieren, in deinem Fall in der von TPanel abgeleiteten Klasse. Damit sind in der Methode alle dem Element zugehörigen Eigenschaften verfügbar obwohl die Funktion nur einmal definiert wurde. Bei Definition innnerhalb der übergeordneten Klasse wird in der Click-Methode 'Sender.Parent' und 'self' immer das gleiche Objekt sein.
Folgender Code wird in diesem Fall also genau den Text des Button ändern, welcher gedrückt wurde.
**bei korrekt zugeordnetem Parent
Du kannst bei der Erzeugung schon eine beliebige Methode (aber mit passenden Funktions-Argumenten) zuweisen:
Code: Alles auswählen
Panel1.Button1.OnClick:= @StartKnopfClick;
Die Funktion wird in einer (beliebigen*) Klasse folgendermaßen Definiert:
Code: Alles auswählen
Procedure StartKnopfClick(Sender: TObject);
begin
writeln('START');
end;
Das Argument (Sender: TObject) ist obligatorisch und variiert je nach zugeordnetem Ereignis. Die nötigen Parameter finden sich in der Doku oder du kannst auch im Objektinspektor für ein gleiches Control ein Eventhandler erzeugen lassen und die Funktions-Argumente dort abschauen.
*Da es sich um eine Methode habdelt, die Instanz der Klasse also mitgeliefert wird, bietet sich es an, die Prozedur in der übergeordneten Klasse zu definieren, in deinem Fall in der von TPanel abgeleiteten Klasse. Damit sind in der Methode alle dem Element zugehörigen Eigenschaften verfügbar obwohl die Funktion nur einmal definiert wurde. Bei Definition innnerhalb der übergeordneten Klasse wird in der Click-Methode 'Sender.Parent' und 'self' immer das gleiche Objekt sein.
Folgender Code wird in diesem Fall also genau den Text des Button ändern, welcher gedrückt wurde.
Code: Alles auswählen
Procedure StartKnopfClick(Sender: TObject);
begin
Button1.Caption:= 'START';
//identisch mit
Self.Button1.Caption:= 'START';
//identisch mit
TButton(Sender).Caption:= 'START';
//identisch mit**
TButton(Sender).Parent.Caption:= 'START';
//identisch mit**
TControl(Sender).Parent.Caption:= 'START';
end;
**bei korrekt zugeordnetem Parent
Re: vererbung eines TPanel's?
kupferstecher hat geschrieben:Das Argument (Sender: TObject) ist obligatorisch und variiert je nach zugeordnetem Ereignis. Die nötigen Parameter finden sich in der Doku oder du kannst auch im Objektinspektor für ein gleiches Control ein Eventhandler erzeugen lassen und die Funktions-Argumente dort abschauen.
Geht auch viel einfacher. Z.B.
Code: Alles auswählen
ButtonNew.OnKeyDown:=
schreiben, Caret hinter das Gleichheitszeichen setzen und entweder: Strg+Umschalt+C
oder mit Dialog: Strg+Umschalt+X drücken.
Danach wird der nötige Code erstellt.
-
- Beiträge: 6207
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: vererbung eines TPanel's?
'Tag' sollte man eigentlich nicht verwenden, ist eher unschön und sollte nur in der Not gemacht werden (Lesbarkeit).
Wieso nur zur Not ?
Wen man eine Array von Buttons hat, ist dies der einfachste Weg diese durch zu nummerieren.
Wen es einzelne dynamisch erzeugte Buttons sind, dann nehme ich für jeden Button ein extra OnClick-Ereignis.
oder mit Dialog: Strg+Umschalt+X drücken.
Den kannte ich noch nicht.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
- kupferstecher
- Beiträge: 422
- Registriert: Do 17. Nov 2016, 11:52
Re: vererbung eines TPanel's?
theo hat geschrieben:Geht auch viel einfacher. Z.B.
Guter Hinweis!
Mathias hat geschrieben:Wieso nur zur Not ?
Weil 'Tag' halt alles sein kann. Wenn es wirklich so eine Eigenschaft braucht, würde ich lieber die Componente ableiten und eine aussagekräftige Eigenschaft hinzufügen. Das sind wenige Zeilen Code. Oder halt in eine Liste packen.
Wenn man Standardkomponenten dynamisch erzeugt, braucht man doch normalerweise sowieso noch weitere Funktionalitäten, d.h. der Button ist Teil einer Klasse, in welcher man dann auch wieder beliebige Variablen definieren kann.
-
- Beiträge: 6207
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: vererbung eines TPanel's?
Weil 'Tag' halt alles sein kann.
Man könnte auch ".Name" nehmen, nur geht dort die Auswertung länger, das Strings verglichen werden müssen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: vererbung eines TPanel's?
das ja ziemlich geil mit dem "Strg+Umschalt+C"
hmm es funktioniert auch alles so wie es soll
aber!
kann ich da irgendwie eine ID mitgeben?
also das ganze läuft so:
Benutzer öffnet die Form
auf der Form gibt es n Buttons die werden aufgrund von Datenbank abfragen erzeugt
Jeder Button ist ein Ameisenvolk in Gebit x und y (nicht wundern hat mit Insekten Forschung zutun)
nun kann der Förster eintragen wie hoch der Haufen ist und wann er gemessen hat (klingt blöd)
also Jeder Knopf ein Volk
daher frage ich mich ob ich jeden Knopf gleich eine Id mitgeben kann und diese In der Procedur auslesen kann?
das mit dem Sender hab ich irgendwie noch nicht ganz verstanden
und ja ich kann es einfach mit DB-Grids etc machen
hab ich auch
nur wollte ich auch neues mal ausprobieren und der Anwendung etwas schwung mitgeben
hmm es funktioniert auch alles so wie es soll
aber!
kann ich da irgendwie eine ID mitgeben?
also das ganze läuft so:
Benutzer öffnet die Form
auf der Form gibt es n Buttons die werden aufgrund von Datenbank abfragen erzeugt
Jeder Button ist ein Ameisenvolk in Gebit x und y (nicht wundern hat mit Insekten Forschung zutun)
nun kann der Förster eintragen wie hoch der Haufen ist und wann er gemessen hat (klingt blöd)
also Jeder Knopf ein Volk
daher frage ich mich ob ich jeden Knopf gleich eine Id mitgeben kann und diese In der Procedur auslesen kann?
das mit dem Sender hab ich irgendwie noch nicht ganz verstanden
und ja ich kann es einfach mit DB-Grids etc machen
hab ich auch
nur wollte ich auch neues mal ausprobieren und der Anwendung etwas schwung mitgeben
Re: vererbung eines TPanel's?
hmmm
warum geht sowas nicht ?
warum geht sowas nicht ?
Code: Alles auswählen
Button1[StrToInt(dsVolk.DataSet.FieldByName('ID').AsString)] := TButton.Create(Self);
Button1[StrToInt(dsVolk.DataSet.FieldByName('ID').AsString)].OnClick := @Button1Button1Click;
procedure TfrmKarte2.Button1Button1Click(Sender: TObject);
begin
LAnzeige.Caption:= 'Hallo '+ Sender.ToString;
end;
Re: vererbung eines TPanel's?
Weil es viel besser ist.
Mit dem Sender erhälst du bereits das Objekt. In diesem Fall eine Instanz von einem TButton:
Idealerweise fragt man noch vorher ab, ob es sich beim Sender um einen TButton handelt:
Mit dem Sender erhälst du bereits das Objekt. In diesem Fall eine Instanz von einem TButton:
Code: Alles auswählen
...
Button1[StrToInt(dsVolk.DataSet.FieldByName('ID').AsString)] := TButton.Create(Self);
Button1[StrToInt(dsVolk.DataSet.FieldByName('ID').AsString)].OnClick := @Button1Button1Click;
Button1[StrToInt(dsVolk.DataSet.FieldByName('ID').AsString)].Caption := 'Hallo';
...
procedure TfrmKarte2.Button1Button1Click(Sender: TObject);
begin
LAnzeige.Caption:= TButton(Sender).Caption;
end;
Idealerweise fragt man noch vorher ab, ob es sich beim Sender um einen TButton handelt:
Code: Alles auswählen
procedure TfrmKarte2.Button1Button1Click(Sender: TObject);
begin
if Sender is TButton then
LAnzeige.Caption:= TButton(Sender).Caption;
end
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;