Speichervariable übergeben

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
flashkid
Beiträge: 35
Registriert: So 14. Feb 2010, 18:15

Speichervariable übergeben

Beitrag von flashkid »

Hey Leute.

Ich habe heute begonnen mit Lazarus zu programmieren.
Nun habe ich einen Programmablauf erstellt, der für 9 verschiedene Objekte das gleiche ausführt. Ich wollte das ganze nun in eine Funktion auslagern, damit ich nicht so viel Code habe und ich Änderungen im Ablauf nicht in alle 9 Routinen übertragen muss.
Nur leider weiß ich nicht, wie ich auf die einzelnen Objekte per Variable zugreifen kann :(

Bsp:

Code: Alles auswählen

if CheckBox1.Checked then begin
    if Skip1 = true then
    else begin
      Shape1.top := round(move(g1,timeT));
      if ypTemp + 10 > Form1.clientHeight then begin
        Shape1.top := Form1.clientHeight -10 ;
        Skip1 := true;
        LTime1.Caption := FloatToStr(timeT);
        LTime1.Top := Shape1.top - 20;
        LTime1.Visible := true;
      end;
    end;
  end;
  if CheckBox2.Checked then begin
    if Skip2 = true then
    else begin
      Shape2.top := round(move(g2,timeT));
      if ypTemp + 10 > Form1.clientHeight then begin
        Shape2.top := Form1.clientHeight -10 ;
        Skip2 := true;
        LTime2.Caption := FloatToStr(timeT);
        LTime2.Top := Shape2.top - 20;
        LTime2.Visible := true;
     end;
    end;
  end;
Mein Wunsch-Code wäre dann:

Code: Alles auswählen

if CheckBox1.Checked then begin
     FunctionXYZ('Shape1','LTime1','Skip1','g1');
  end;
 
  if CheckBox2.Checked then begin
     FunctionXYZ('Shape2','LTime2','Skip2','g2');
  end;
end;
 
  function FunctionXYZ(var a,b,c,d: String);
  begin
    %a%.top := round(move(%d%,timeT));
    if ypTemp + 10 > Form1.clientHeight then begin
      %a%.top := Form1.clientHeight -10 ;
      %c% := true;
      %b%.Caption := FloatToStr(timeT);
      %b%.Top := Shape1.top - 20;
      %b%.Visible := true;
    end;
  end;
Ich hoffe ihr versteht was ich vorhabe :)

Gruß, flashkid

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

Re: Speichervariable übergeben

Beitrag von theo »

Wie kommst du denn drauf, die Objekte/Variablen als String zu übergeben?
̈́Übergibt sie doch einfach als das, was sie sind:

z.B:

Code: Alles auswählen

procedure XYZ(Shp:TShape; Labl:TLabel; Skip:Boolean; g:integer);
begin
 
end;

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

Re: Speichervariable übergeben

Beitrag von creed steiger »

Schau dir mal die Video Tutorials zu Lazarus/Freepascal an
Da ist sowas ähnliches dabei

http://www.youtube.com/user/SchoolFreew ... IEpIEzZJak" onclick="window.open(this.href);return false;

flashkid
Beiträge: 35
Registriert: So 14. Feb 2010, 18:15

Re: Speichervariable übergeben

Beitrag von flashkid »

Danke so funktioniert das :)
Ich dachte, dass man den Namen per String übergeben kann und dann die Variable erkannt wird :oops:

Da habe ich noch eine Frage dazu: Ich habe nun in der Procedure "Skip := True" stehen. Doch leider wird das nicht in die Aufruf-Variable Skip1 übernommen :( Liegt das an irgendwelchen global / local Problemen? Wie kann ich eine Variable in einer Procedure als global definieren? Ich muss alle Variablen, die ich verwende per Parameter übergeben, wobei ich das nur bei 3 Stück brauche.

Code: Alles auswählen

if CheckBox1.Checked then begin
ShowMessage(BoolToStr(Skip1));
if Skip1 <> true then func(Shape1,LTime1,Skip1,g1,timeT);
end;
BTW: Gibt es eine bessere Methode eine Variable zu überprüfen als per ShowMessage? Habe es mit "WriteLn(BoolToStr(Skip1))" versucht, dann kommt aber beim Ausführen der Procedure "Error: Project project1.exe raised exception class 'RunError(103)." :(

EDIT: @creed steiger: Danke, werde mir diese anschauen, ist sicher viel nützliches dabei ;)

EDIT2: Habe es nun per

Code: Alles auswählen

for n:=1 to 9 do
  begin
    if CheckBox[n].Checked then begin
      if Not[n] <> true then begin
         Not[n] := xyz(a,b,c);
      end;
    end;
  end;
und

Code: Alles auswählen

function xyz(a,b,c:Integer) : boolean;
Begin
  if a + 10 > Form1.clientHeight then begin
    Result := true;
  end
  else Result := false;
End;
gelöst, funktioniert ganz gut :)

Antworten