Programteile in weitere Unit auslagern

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Programteile in weitere Unit auslagern

Beitrag von DL3AD »

Hallo,

ich versuche gerade mich in Pascal einzuarbeiten.
Damit ich verschiedene Dinge besser verstehe schreibe ich immer kleine Testproggys.
Ich möchte herausfinden wie ich Functionen und Proceduren auslagern kann.
Dazu habe ich eine MainUnit und eine RechnerUnit erzeugt.
In der MainUnit habe ich alle GUI-Elemente und die Ereignissbehandlung untergebracht.
In der Rechnerunit dann die zwei Functionen plus und minus.

Sind die beiden Functionen plus und minus in der MainUnit - dann funst es wie soll.
Wenn ich sie auslagere dann nicht.
Wo ist mein Fehler ?

hier die MainUnit

Code: Alles auswählen

unit Mainunit;
// Testprogram 1 "Rechner"
// Proceduren und Funktionen ausgelagert in einer Unit
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  RechnerUnit;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button_Minus: TButton;
    Button_Plus: TButton;
    Edit_Zahl1: TEdit;
    Edit_Zahl2: TEdit;
    Edit_Ergebniss: TEdit;
    Label_Zahl1: TLabel;
    Label_Zahl2: TLabel;
    Label_Ergebniss: TLabel;
    procedure Button_MinusClick(Sender: TObject);
    procedure Button_PlusClick(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
 
implementation
 
{$R *.lfm}
 
//function plus(z1,z2:string):string;
//begin
// result := FloatToStr(StrToFloat(z1) + StrToFloat(z2));
//end;
 
//function minus(z1,z2:string):string;
//begin
// result := FloatToStr(StrToFloat(z1) - StrToFloat(z2));
//end;
 
 
{ TForm1 }
 
procedure TForm1.Button_PlusClick(Sender: TObject);
begin
    Edit_Ergebniss.Text := plus(Edit_Zahl1.Text,Edit_Zahl2.Text);
end;
 
procedure TForm1.Button_MinusClick(Sender: TObject);
begin
    Edit_Ergebniss.Text := minus(Edit_Zahl1.Text,Edit_Zahl2.Text);
end;
 
end.                                    
und hier die RecnerUnit

Code: Alles auswählen

unit RechnerUnit;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils;
 
implementation
 
function plus(z1,z2:string):string;
begin
 result := FloatToStr(StrToFloat(z1) + StrToFloat(z2));
end;
 
function minus(z1,z2:string):string;
begin
 result := FloatToStr(StrToFloat(z1) - StrToFloat(z2));
end;
 
end.                    
Gruß Frank

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

Re: Programteile in weitere Unit auslagern

Beitrag von theo »

Du musst die Funktonen im Interface Teil deklarieren, sonst sind sie von ausserhalb der Unit nicht sichtbar.

function plus(z1,z2:string):string;
function minus(z1,z2:string):string;
Zuletzt geändert von theo am Fr 24. Jan 2014, 12:37, insgesamt 1-mal geändert.

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

Re: Programteile in weitere Unit auslagern

Beitrag von Michl »

Siehe z.B. http://www.delphi-treff.de/object-pasca ... bau/#c4935

Huch, Theo war schneller... :)

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Programteile in weitere Unit auslagern

Beitrag von DL3AD »

@theo,

Danke nun funst es 8)

@Michl

Danke für den Link.

Gruß Frank

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Programteile in weitere Unit auslagern

Beitrag von DL3AD »

Hallo,

ich habe früher OOP in VB.Net gemacht - möchte dass nun auch in FPC nutzen.
Zum Verständniss habe ich versucht eine class zu definieren - funst aber nicht.
Ich brauche mal Hilfe.

In der class "ClassRechner" möchte ich die Methode "plus" und die Propertys z1,z2,erg implementieren.
Das Datenhandling über propertys finde ich recht angenehm. (hatte ich in VB.Net nur so gemacht).

Hier mein kläglicher Versuch.

Code: Alles auswählen

unit ClassRechner;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils;
 
type
  TRechner = class
  private
    Fz1:string;
    Ferg:string;
 
  public
    Procedure quadrat(z1:string);
    property z1:string write quadrat;
    property erg:string read Ferg;
  end;
 
 
implementation
 
 Procedure quadrat;
begin
 Ferg := FloatToStr(StrToFloat(Fz1 )* StrToFloat(Fz1 ));
end;
 
end.                                  
 
 
Bitte um Hilfe

Gruß Frank

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: Programteile in weitere Unit auslagern

Beitrag von mse »

DL3AD hat geschrieben:

Code: Alles auswählen

 
 
implementation
 
Procedure TRechner.quadrat(z1:string);
 
Edit: Da ist noch mehr nicht ganz richtig. Empfehlung: Dokumentation lesen. ;-)
http://www.freepascal.org/docs-html/ref ... 900006.4.1

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Programteile in weitere Unit auslagern

Beitrag von DL3AD »

Hallo mse,

Danke nun läuft es - muss mich erst an FPC gewöhnen ist doch einiges anders als bei VB.Net oder Java.
FPC macht spass - die Sprache ist irgenwie nicht so verkrampft und vorallem ist der Code sehr gut lesbar :)

Gibt es irgendwo eine Übersicht welche Classen was enthalten - suche speziell Messageboxen und was zur seriellen Schnittstelle (RS232) ?

Gruß Frank

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: Programteile in weitere Unit auslagern

Beitrag von mse »

Zu Lazarus kann ich nichts sagen, in MSEide sind die RS232-Komponenten im tab Comm. Was meinst du mit "Messageboxen"?

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: Programteile in weitere Unit auslagern

Beitrag von creed steiger »

synaser z.b.

http://synapse.ararat.cz/doku.php/start

über die Forensuche solltest du auch einiges finden

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Programteile in weitere Unit auslagern

Beitrag von DL3AD »

Hallo creed steiger,

danke dass wird weiterhelfen.

@mse

ich meine Messageboxen wie z.B. eine Box mit einer Massage und OK Button oder Ja Nein Cancel oder eine Box nur mit einer Message die man mit einer close Anweisung per Proggy schließen kann.

Gruß Frank

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: Programteile in weitere Unit auslagern

Beitrag von mse »

Da gibt es verschiedene showmessage()- und ask*()- Funktionen in MSEgui msewidgets.pas.

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: Programteile in weitere Unit auslagern

Beitrag von creed steiger »

http://wiki.lazarus.freepascal.org/Dialog_Examples

sollte für den Anfang weiterhelfen

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Programteile in weitere Unit auslagern

Beitrag von DL3AD »

... Danke - das Wiki ist ja klasse :)

kann man dass auch geziehlt über die IDE aufrufen (z.B. per F1) ?

Gruß Frank

Antworten