Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Lazarus Funktion als Baustein nutzen (https://www.delphipraxis.net/191937-lazarus-funktion-als-baustein-nutzen.html)

stay 5. Mär 2017 19:10

Lazarus Funktion als Baustein nutzen
 
Hallo :) hoffe ich habe das richtige Forum getroffen.
Ich bin eher unerfahren und hätte eine Frage.
Bei der Programmierung einer SPS kann ich wiederholende Funktionen einmal Programmieren und dann als fertigen Baustein nutzen, mit veränderten Ein- und Ausgangswerten. Also z.B. eine Motorsteuerung, AN AUS NOTAUS LINKS- UND RECHTSlAUF...

Kann ich vergleichbares in Lazarus erstellen?

Als Beispiel:

procedure TForm1.NAME1Click(Sender: TObject);
begin

IF NAME3 > 12 then
NAME2.cells[0,1] := 'Pommes';
NAME2.cells[1,0] := 'Döner';
end;


Es soll so sein, dass ich die Funktion in sich geschlossen habe und von außen nur die Eingabe (NAME1,NAME2) und Ausgabe (NAME2) habe.
NAME1 = Button1 , Button2...
NAME2= Stringgrid1, Stringgrid2...
NAME3= 12,31,2...

Ist das möglich, was nehme ich dazu?

Vielen Dank

scrat1979 5. Mär 2017 20:41

AW: Lazarus Funktion als Baustein nutzen
 
Vielleicht hilft dir folgender Link weiter.

http://bergt.de/workshop/delphi/html/delphi39.htm

blawen 5. Mär 2017 20:58

AW: Lazarus Funktion als Baustein nutzen
 
Dies lässt sich problemlos umsetzen, allerdings empfehle ich Dir, dich vorgängig mit den allgemeinen Grundlagen zu befassen.

Den Motor starten kannst Du z.B. mit einer Function à la
Delphi-Quellcode:
function Motor_X_Achse(Drehrichtung : String; Geschwindigkeit : Integer) : String;
begin
...
  Result := Aktueller_Status_des_Motor;
end;
Die Logik der SPS kannst Du vermutlich vom Ansatz her übernehmen.

stay 5. Mär 2017 21:24

AW: Lazarus Funktion als Baustein nutzen
 
Hallo, danke für eure schnelle Antwort.
Die Motorsteuerung war nur ein Beispiel um meine Frage besser zu verstehen.

Es geht eigentlich um eine Liste, Stringgrid. Ich habe eine erzeugt, mit Inhalt und je nach integer die Größe bestimmt usw.. und nun würde ich gerne eine andere Steinggrid an anderer Stelle mit anderen Werten aber selber Logik benutzen.
Klar, ich könnte das ganze kopieren und stringgrid1 mit stringgrid2 tauschen, dachte voelleicht gibt es aber eine schönere Lösung.

Ich hoffe es ist einigermaßen verständlich was ich möchte.
Bei einer Funktion ändere ich ja eher das rechts vom :=
Ich würde gerne das linke ändern.

Variable := bleibt fest.
Variable := bleibt fest.
......

Variable soll dann stringgrid1.cells, steinggrid2.cells und so weiter sein.

Dankeschön schonmal.
Entschuldige wenn ich es etwas kompliziert schreibe, aber step7 funktion (nicht funktionsbaustein) trifft es vom Prinzip her am ehesten.

Aviator 5. Mär 2017 22:46

AW: Lazarus Funktion als Baustein nutzen
 
Vielleicht sowas in der Art:

Delphi-Quellcode:
procedure TForm1.FillGrid(Grid: TStringGrid);
begin
  Grid.Cell[0, 1] := 'Cell 1';
  Grid.Cell[0, 2] := 'Cell 2';
  Grid.Cell[0, 3] := 'Cell 3';
  Grid.Cell[0, 4] := 'Cell 4';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FillGrid(StringGrid1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  FillGrid(StringGrid2);
end;
Die zu füllenden Werte könntest du theoretisch als zweiten Parameter in einem (zweidimensionalen) Array übergeben.

stay 6. Mär 2017 09:57

AW: Lazarus Funktion als Baustein nutzen
 
Guten Morgen, dass wäre auch eine Idee.
Nur nochmal für mich als Sicherheit, ich kann in einem Array keine “Objekte“ speichern?
Also in etwa so.verzeihe mir die Form, aber ich bin grade am Handy.

Array = label1 , label2..'

Button.click

Array1 := “hallo“;

Buttonxy.click
Array2 := “huhu“;

Aviator 6. Mär 2017 10:41

AW: Lazarus Funktion als Baustein nutzen
 
Ein Array kann für alle möglichen Datentypen erstellt werden. Du kannst dir auch deine Objekte in die etwas reingeschrieben werden soll in einer TObjectList speichern.

Delphi-Quellcode:
type
  MyComponentsArray = array of TComponent; // Oder auch array of TObject oder array of TStringGrid


  // Oder als ObjectList
  MyComponentsList = TObjectList<TComponent>; // Oder TObjectList<TStringGrid> oder einfach nur TObjectList --> Dann bist du für das Casten selbst verantwortlich

implementation

procedure ArrayTest;
begin
  SetLength(MyComponentsArray, 2);
  MyComponentsArray[0] := StringGrid1;
  MyComponentsArray[1] := StringGrid2;
end;

procedure ObjectListTest;
begin
  MyComponentsList.Add(StringGrid1);
  MyComponentsList.Add(StringGrid2);
end;
Da du deine Delphi Version nicht genannt hast kann ich nicht sagen, ob es bei dir bereits Generics gibt oder nicht. Es gäbe also viele Möglichkeiten Objekte zu speichern. Hier kommt es auf den Anwendungsfall an und wie sinnvoll dann das Ganze ist.

stay 6. Mär 2017 19:10

AW: Lazarus Funktion als Baustein nutzen
 
Gute Frage, ich nutze es auf dem Pi, Raspbian Jessy. Lazarus 1.2.x .

Aviator 6. Mär 2017 20:16

AW: Lazarus Funktion als Baustein nutzen
 
Zitat:

Zitat von stay (Beitrag 1363362)
Gute Frage, ich nutze es auf dem Pi, Raspbian Jessy. Lazarus 1.2.x .

Sorry. Auf Lazarus hätte ich auch selbst kommen können. :oops:

Hast es ja schließlich auch im richtigen Unterforum gepostet. :thumb:

Allerdings kenne ich mich mit Lazarus überhaupt nicht aus und kann daher auch nicht sagen ob es diese Typen gibt oder nicht.

MichaelT 7. Mär 2017 16:51

AW: Lazarus Funktion als Baustein nutzen
 
Da Aviator hat bestimmt ein sehr guten Zugang aufgezeigt in dem praktisch das Grid als View nimmt und nicht die Logik in das Grid einbaut. An das halte ich mich auch.

Mit Objekten im Array.

Du hast vermutlich ein Free Pascal Compiler 2.6.4 oder einen 2.6.2. Sieht du im help/about oder auf der Kommandozeile fpc.

Ich kann mir nicht vorstellen, dass in den hohen Version vom FPC Generics noch limitiert wären auf Basisdatentypen ... Offiziell ist der Support seit 2.2 da

http://wiki.freepascal.org/Generics

---

Brauchst du aber gar nicht.

Du hast 2 Möglichkeiten in 2 Richtungen.

a) Soll das Array eine fixe Anzahl von Elementen halten oder eine unlimitierte/dynamische Anzahl
b) Was ist die beste Basisklasse die du brauchst oder machst du je Art von Control ein eigenes Array

Im Falle a) und die Länge sei dynamisch, dann arbeite mit SetLength
b= Suche dir ein Basisklasse die genug kann. Wenn du 2 Grids verwaltest bspw. weißt du eh, dass ein Grid hast...

Garbage Collector hast du keinen. Tupel Notation gehen nicht. Ob die Tupel die 2013 andiskutiert wurden jemals ins Fliegen kamen ...

Zitat:

Zitat von stay (Beitrag 1363290)
Guten Morgen, dass wäre auch eine Idee.
Nur nochmal für mich als Sicherheit, ich kann in einem Array keine “Objekte“ speichern?
Also in etwa so.verzeihe mir die Form, aber ich bin grade am Handy.

Array = label1 , label2..'

Button.click

Array1 := “hallo“;

Buttonxy.click
Array2 := “huhu“;



Alle Zeitangaben in WEZ +1. Es ist jetzt 20:56 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz