[solved] Erzeugen von Komponeten

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
paulderfinne
Beiträge: 65
Registriert: Mi 27. Feb 2013, 18:24
OS, Lazarus, FPC: Linux (L 0.9.30.4-1.1 FPC 2.6.0)
CPU-Target: 32Bit

[solved] Erzeugen von Komponeten

Beitrag von paulderfinne »

Hallo liebe Gemeinde,

erstmal verspäetet die besten Neujahrswünsche.

Nun zu meinem Problem. Ich habe versucht ein Minimalbeispiel zu kreieren.

Ich habe 2 Units. Im unit2 wird über einen Button ein Editfeld erzeugt. (Die prinzipielle Methoden dazu habe ich u.a. mit eurer Hilfe geschafft).

Nun möchte ich bereits von unit1 aus diese Erzeugung durchführen, weiß aber nicht wie. Hat jemand von Euch den Durchblick, der mir offensichtlich fehlt.

Code: Alles auswählen

 
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms,
Controls, StdCtrls, Grids, Graphics, Dialogs, DbCtrls, DBGrids,  Unit2;
 
type
TForm1 = class(TForm)
  Button1: TButton;
  Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure clickbutton1(Sender:TObject);
procedure clickbutton2(Sender:TObject);
private
{ private declarations }
public
{ public declarations }
end;
 
var
Form1: TForm1;
 
implementation
 
 procedure Tform1.FormCreate(Sender: TObject);
 begin
 end;
//** Hier mein naiver Versuch von hier aus das EditFeld zu erzeugen
 {
 procedure TForm1.clickbutton1(Sender:Tobject);
 begin
 Form2.ErzeugenClick(Sender:Tobject);
 Form2.showmodal;
 end;
 }
 
 procedure TForm1.clickbutton2(Sender:Tobject);
 begin
 Form2.showmodal;
 end;
 
var
NewButton:TButton;
 
initialization
{$I unit1.lrs}
 
end.
 

Code: Alles auswählen

 
unit Unit2; 
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
  { TForm2 }
  TForm2 = class(TForm)
    Button1: TButton;
    edit:Tedit;
    procedure ErzeugenClick(sender:TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
var
  Form2: TForm2; 
 
implementation
procedure Tform2.ErzeugenClick(sender:TObject);
  begin
  edit:=TEdit.Create(self);
    with edit do
    begin
      Parent:= Form2;
      Left:= 30;
      width:= 130;
      Top := 30;
      Name := 'edit1';
      Text := 'terve maailma';
    end;
{$R *.lfm}
  end;
end.                  
 
Zuletzt geändert von paulderfinne am Sa 3. Jan 2015, 15:12, insgesamt 1-mal geändert.

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Erzeugen von Komponeten

Beitrag von Komoluna »

Du hast eine Prozedur

Code: Alles auswählen

Form2.ErzeugenClick(Sender: TObject);
Also musst du die Prozedur mit einem Parameter vom Typ TObject aufrufen.
Wenn du in deiner Prozedur Sender nicht benötigst, kannst du einfach nil nehmen.

Also:

Code: Alles auswählen

procedure TForm1.clickbutton1(Sender:Tobject);
begin
  Form2.ErzeugenClick(nil);
  Form2.showmodal;
end;
MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

paulderfinne
Beiträge: 65
Registriert: Mi 27. Feb 2013, 18:24
OS, Lazarus, FPC: Linux (L 0.9.30.4-1.1 FPC 2.6.0)
CPU-Target: 32Bit

Re: Erzeugen von Komponeten

Beitrag von paulderfinne »

Vielen Dank Komoluna, damit scheint es tatsächlich zu funktionieren.
Komoluna hat geschrieben: Wenn du in deiner Prozedur Sender nicht benötigst, kannst du einfach nil nehmen.
Woher weiß ich das? Wie gesagt, das funktioniert (nach allerersten Tests) mit nil, aber was sagt mir dieses Sender:TObject?

Ihr müsst verzeihen, aber diese ganze Objektgeschichte ist mir nur zum Teil verständlich.

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

Re: Erzeugen von Komponeten

Beitrag von theo »

Ich glaube du verwirrst dich gerade selber ein bisschen.

Dein ursprüngliches Problem hat mit "Objektgeschichten" gar nichts zu tun.
Das ist bei normalen Funktionen auch so. Du rufst auch normale Funktionen mit einem Wert/Variablen auf und wiederholst nicht die Deklaration.

Was du gemacht hast, wäre auf eine einfache Funktion übertragen:
ShowMessage(const aMsg: string);
richtig wäre aber:
ShowMessage('hallo'); oder ShowMessage(MyString);

Zur zweiten Frage:
Ob du die Variable Sender verwendest, siehst du ja in deiner Funktion.
Wenn nicht, ist er überflüssig und kann in diesem Falle auch durch nil ersetzt werden, damit der Compiler glücklich ist.

Der "Sender" kann wichtig sein, um auf das Objekt welche das Ereignis ausgelöst hat zugreifen zu können (z.B. der Button der geklickt wurde).

paulderfinne
Beiträge: 65
Registriert: Mi 27. Feb 2013, 18:24
OS, Lazarus, FPC: Linux (L 0.9.30.4-1.1 FPC 2.6.0)
CPU-Target: 32Bit

Re: Erzeugen von Komponeten

Beitrag von paulderfinne »

Vielen Dank Theo für deine tröstlichen Worte. Ja, manchmal fühle ich mich total verwirrt.

Eigentlich habe ich das mir den Prozeduren und Funktionen schon lang verstanden. Ich habe schließlich in grauer Vorzeit richtig viel mit Turbo-Pascal programmiert. Jetzt aber, mit der Objekt-Programmierung komme ich wirklich durcheinander. Aber eigelntlich sollte ich euch mit solchen Sachen nicht langweilen. Ich müsste mich halt mal ein bisschen mehr theoretisch mit der Sache auseinanderstezen.

Vielen Dank jedenfalls für Eure Hilfe. Ihr habt mir wiedermal weitergeholfen. Ich setze den Thread auf "Solved".

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

Re: Erzeugen von Komponeten

Beitrag von theo »

Zur objektorientierten Programmierung empfehle ich diese kurze Lektüre:
http://www.delphi-treff.de/tutorials/ob ... ashkurs/8/
Das ist mMn wirklich sehr gut, kompakt und recht vollständig beschrieben.
Vielleicht muss man den Text als Anfänger mehrmals lesen, aber es lohnt sich.

paulderfinne
Beiträge: 65
Registriert: Mi 27. Feb 2013, 18:24
OS, Lazarus, FPC: Linux (L 0.9.30.4-1.1 FPC 2.6.0)
CPU-Target: 32Bit

Re: Erzeugen von Komponeten

Beitrag von paulderfinne »

theo hat geschrieben:Zur objektorientierten Programmierung empfehle ich diese kurze Lektüre:
es lohnt sich.
Vielen Dank auch für doiesen Tipp, theo. Ich werde ihn "reinziehen".

Antworten