Aufrufen von gleichbenannten proceduren in versch, Fomularen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
karkov
Beiträge: 69
Registriert: Di 27. Okt 2009, 17:52

Aufrufen von gleichbenannten proceduren in versch, Fomularen

Beitrag von karkov »

Liebes Lazarusforum,

ich habe folgendes Problem. Ich habe mehrere formulare, die über eine procedure verfügen (backupload() ), die in jedem Formular anders ist, überall aber gleich heißt. Das Hauptfomular besitzt eine Procedure, die ein formular als in-wert übertragen bekommt und soll in diesem Formular nun die procedur backupload aufrufen.
Geht das überhaupt? Der ansatz ist ja recht objektorientiert..

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Aufrufen von gleichbenannten proceduren in versch, Fomularen

Beitrag von Scotty »

"Objektorientiert" ist das nicht gerade. Wenn du die Methode einer Klasse (hier TForm) aufrufst, dann musst du die Klasse sowieso angeben: Form1.Backup() vs. Form2.Backup(). Oder verstehe ich das Problem nicht richtig?
Funktionen mit gleichem Namen werden per overload gekennzeichnet. Die Auswahl erfolgt dann automatisch.

Code: Alles auswählen

public
function Add(a,b:byte):byte;overload;
function Add(a,b:integer):integer;overload;

karkov
Beiträge: 69
Registriert: Di 27. Okt 2009, 17:52

Re: Aufrufen von gleichbenannten proceduren in versch, Fomularen

Beitrag von karkov »

nein da hast Du mich ein wenig missverstanden. meine procedure im Hauptformular würde so aussehen:
procedure tfhaupt.backupprior(form:tform);
begin
...
form.backupload();
...
end;

jenachdem, wie ich die procedure nun aufrufe, soll die procedure des entsprechenden formulares gestartet werden. So wie das dasteht funktioniert es aber nun mal nicht.
In Java hätte ich einfach ein interface gabastelt und alles wäre OK, aber so etwas kenne ich in PASCAL nicht.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Aufrufen von gleichbenannten proceduren in versch, Fomularen

Beitrag von Socke »

  • Ändere deinen Entwurf so ab, dass die Formulare ihre Funktion als Ereignis/Callback selbst bekannt geben.
  • Erstelle eine Formular-Klasse, die nichts weiter macht, als dieses Methode zu deklarieren. Von dieser leitest du alle anderen Formulare ab.
  • karkov hat geschrieben:In Java hätte ich einfach ein interface gabastelt und alles wäre OK, aber so etwas kenne ich in PASCAL nicht.
    Interfaces gibt es in Pascal auch; einfach in der Dokumentation (Sprachreferenz) suchen.
  • Code: Alles auswählen

    var
    proc: procedure of object;
    proc := frm.MethodAdress('backupload');
    proc()
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Aufrufen von gleichbenannten proceduren in versch, Fomularen

Beitrag von mse »

In MSEide, Lazarus ist sicher ähnlich:

Code: Alles auswählen

type
 tbackupform = class(tmseform)
  protected
   class function hasresource: boolean; override;
          //not necessary if tbackupform is a design time form
  public
   procedure backupload; virtual; abstract;
 end;
 
 tbackupform1 = class(tbackupform)
  protected
   class function hasresource: boolean; override;
          //not necessary if tbackupform1 inherits from 
          //design time form tbackupform by 'File'-'New'-'Form'-'Inherited Form'
  public
   procedure backupload; override;
 end;
 
 tbackupform2 = class(tbackupform)
  protected
   class function hasresource: boolean; override;
          //not necessary if tbackupform2 inherits from 
          //design time form tbackupform by 'File'-'New'-'Form'-'Inherited Form'
  public
   procedure backupload; override;
 end;
 
 tfhaupt = class(tmseform)
  public
   procedure backupprior(const aform: tbackupform);
 end;
 
implementation
 
{ tbackupform }
 
class function tbackupform.hasresource: boolean;
begin
 result:= false;
end;
 
{ tbackupform1 }
 
class function tbackupform1.hasresource: boolean;
begin
 result:= true;
end;
 
procedure tbackupform1.backupload;
begin
 // load backup
end;
 
{ tbackupform2 }
 
class function tbackupform2.hasresource: boolean;
begin
 result:= true;
end;
 
procedure tbackupform2.backupload;
begin
 // load backup
end;
 
{ tfhaupt }
 
procedure tfhaupt.backupprior(const aform: tbackupform);
begin
 aform.backupload;
end;
Mit interface:

Code: Alles auswählen

type
 {$interfaces corba}
 ibackup = interface ['{46B70DC4-9E09-4611-9F92-F39C3881E4FC}']
  procedure backupload;
 end;
 
tbackupform1 = class(tmseform,ibackup)
  public
   procedure backupload;
 end;
 
 tbackupform2 = class(tmseform,ibackup)
  public
   procedure backupload;
 end;
 
 tfhaupt = class(tmseform)
  public
   procedure backupprior(const aform: tmseform);
 end;
 
implementation
 
{ tbackupform1 }
 
procedure tbackupform1.backupload;
begin
 // load backup
end;
 
{ tbackupform2 }
 
procedure tbackupform2.backupload;
begin
 // load backup
end;
 
{ tfhaupt }
 
procedure tfhaupt.backupprior(const aform: tmseform);
var
 intf1: ibackup;
begin
 if aform.getinterface(ibackup,intf1) then begin
  intf1.backupload;
 end;
end;
Martin

karkov
Beiträge: 69
Registriert: Di 27. Okt 2009, 17:52

Re: Aufrufen von gleichbenannten proceduren in versch, Fomularen

Beitrag von karkov »

Ok, die Theorie ist mir jetzt klar, aber ich habe noch ein Problem mit der Konkreten umsetzung. Wo muss ich denn in meinem Projekt eine Klasse vormulieren? Oder muss ich eine extra Pas-Datei erstellen, mit dem Interface oder der Klasse und sie dann in das Programm importieren? Und wenn ja, wie genau geht das?

Antworten