vererbung eines TPanel's?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

vererbung eines TPanel's?

Beitrag von TT73GP7 »

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

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: vererbung eines TPanel's?

Beitrag von Mathias »

Suchst du so was ?

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

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: vererbung eines TPanel's?

Beitrag von TT73GP7 »

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

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: vererbung eines TPanel's?

Beitrag von theo »

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,

Benutzeravatar
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?

Beitrag von gladio »

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.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: vererbung eines TPanel's?

Beitrag von Mathias »

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) 103-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: vererbung eines TPanel's?

Beitrag von TT73GP7 »

hmm ok

das muss ich mal durchprobieren
klingt garnicht so schlecht das auf diese art und weise zumachen

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: vererbung eines TPanel's?

Beitrag von kupferstecher »

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

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

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: vererbung eines TPanel's?

Beitrag von theo »

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.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: vererbung eines TPanel's?

Beitrag von Mathias »

'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. :shock:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: vererbung eines TPanel's?

Beitrag von kupferstecher »

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.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: vererbung eines TPanel's?

Beitrag von Mathias »

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

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: vererbung eines TPanel's?

Beitrag von TT73GP7 »

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

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: vererbung eines TPanel's?

Beitrag von TT73GP7 »

hmmm

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;
 
 
 

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: vererbung eines TPanel's?

Beitrag von Michl »

Weil es viel besser ist.

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; 

Antworten