Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Lokale Variablen und Komponenten zugriff
tetris84 - Mo 19.12.11 12:56
Titel: Lokale Variablen und Komponenten zugriff
Hallo,
bis jetzt habe ich immer viel mit Free Pascal programmiert. In Delphi habe ich mich jetzt auch schon relativ gut als Anfänger zurecht gefunden. Jedoch habe ich noch 2-3 grundlegende Fragen die für eine saubere Programmierung zwingend nötig sind.
Frage 1:
Ich arbeite in meinem Hauptformular zum Beispiel mit einem Array das von vielen Verschiedenen proceduren und funktionen benutzt wird. Die einfache Lösung wäre es global zu deklarieren. Das möchte ich aber nicht. Wie kann ich dieses Array jetzt übergeben? Bei Aufrufen in Pascal geht das ja recht einfach: procedure (Array:TArray);
Aber wie ist das bei einem OnClick ereignis oder ähnlichen?
Frage 2:
Die Frage ist recht ähnlich. Wenn ich in meinem Hauptformular auf Speichern klicke gibt es natürlich die Procedure "OnClickSpeichernUnter" Ich möchte jetzt aus sicherheit den Code in eine andere Procedure schreiben da der gesamte Code ansonsten beim Löschen den Buttons SpeichernUnter gelöscht mit wird. Wie übegebe ich da dann den SaveDialog?
Ich hoffe ich habe meine Fragen richtig formuliert ;)
Lg tetris84
Nersgatt - Mo 19.12.11 13:03
Moin,
Du kannst die Array auch im Formular als Private deklarieren. Dann kannst Du innerhalb der Formularinstanz darauf zugreifen.
Du kannst ein SaveDialog in einer Procedure dynamisch erstellen, wenn Sie sie benötigst, ohne es vorher auf dem Formular zu platzieren.
Aber beim Löschen eines Buttons bleibt doch der Code bestehen. :wink:
tetris84 - Mo 19.12.11 13:36
Wenn ich es unter Private deklariere ist es doch trotzdem noch global oder?
Es ist ja auf dem Formular platziert. Ich kann nur nicht von anderen Proceduren drauf zugreifen. Selbst wenn ich beim Aufruf Sender:TObject übergebe (ich weiß das soll man nicht).
bummi - Mo 19.12.11 13:41
Wenn es Methoden sind derselben Klasse sind kannst Du direkt darauf zugreifen, sonst nicht...
Delphi-Quelltext
1: 2:
| procedure TForm.Tuwas; procedure Tuwas; |
tetris84 - Mo 19.12.11 13:45
Und wie kann ich dann indirekt drauf zugreifen? :/
Nersgatt - Mo 19.12.11 13:50
Dann müsstest Du es z.B. über eine Public Property "von außen" (also von außerhalb der Klasse) zugänglich machen.
Ich glaub, Dir fehlen noch einige absoluten Grundlagen. Du könntest Dir mal den Chrashkurs von Christian durcharbeiten:
http://www.christian-stelzmann.de/artikel/CrashkursReloaded/
Insbesondere das letzte Kapitel und mit dem Wissen im Hintergrund, dass ein Formular auch nur eine Klasse ist.
Gausi - Mo 19.12.11 14:16
Speichern mit Hilfe eines Savedialogs sollte man imho in etwa so machen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.Button1Click(Sender: TObject); begin if SaveDialog1.Execute then SpeichereZeugs(SaveDialog1.Filename); end;
procedure SpeichereZeugs(aFilename: String); begin end; |
Dann hat man den eigentlichen Code zum Speichern ausgelagert und kann ihn ggf. sogar an anderer Stelle weiter verwenden. Der Speichern-Code hat ja nichts mit dem Formular zu tun (es sei denn, du willst das Formular speichern ;-)). Daher sollte der in der Regel auch außerhalb der Form-Klasse stehen.
tetris84 - Mo 19.12.11 15:29
Ok danke für die Hilfe manchmal sieht man glaub ich den Wald vor lauter Bäumen nicht :D
Ich hab nochmal ne frage zu den Globalen Variablen nur zum verständnis:
Delphi-Quelltext
1:
| type TArrayName = array [0..10] of string; |
Delphi-Quelltext
1: 2: 3: 4:
| procedure ButtonClick (...); Begin ShowMessage (Button2Array[1]); End; |
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure AndererButtonClick (...); var Button2Array : TArrayName; Begin Button2Array[1] := 'Test'; End; |
Wie würde ich Button2Array über procedure ButtonClick ausgeben lassen können?
bummi - Mo 19.12.11 15:46
so schon, aber schön ist anders....
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var Button2Array : TArrayName;
procedure AndererButtonClick (...); Begin Button2Array[1] := 'Test'; End;
procedure ButtonClick (...); Begin ShowMessage (Button2Array[1]); End; |
tetris84 - Mo 19.12.11 15:51
Ja genau diese Variante hab ich zurzeit in meinen Programmen auch. Also geht es nicht anders?
Nersgatt - Mo 19.12.11 15:53
Viele Wege führen nach Rom.
Du könntest das Array auch als Parameter an die Procedure übergeben. Ist immer eine Frage des konkreten Falls, welcher Weg der schönere/schnellere/bessere ist.
tetris84 - Mo 19.12.11 15:59
Genau und wie übergebe ich es dann? Ich meine beim ButtonClick weiß der Compiler dann ja nicht woher er das nehmen soll oder?
Nersgatt - Mo 19.12.11 16:08
Beispiel:
Delphi-Quelltext
1: 2:
| type TMeinArray = Array[0..2] of string; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm10.btn1Click(Sender: TObject); var arr : TMeinArray; begin
arr[0] := 'String 1'; arr[1] := 'String 2'; arr[2] := 'String 3';
TuWasMitArray(arr);
end;
procedure TForm10.TuWasMitArray(AArray: TMeinArray); begin ShowMessage(AArray[2]); end; |
bummi - Mo 19.12.11 16:21
Wobei bei TuWas im Sinne von Änderung soll möglich sein folgende Deklaration erfordert:
Delphi-Quelltext
1:
| procedure TForm10.TuWasMitArray(var AArray: TMeinArray); |
tetris84 - Mo 19.12.11 16:24
Ne ihr versteht mich glaub ich falsch. Beide Proceduren sind zum Beispiel ButtonClick oder so. Die kann man ja (meines Wissens nach) nicht von einer anderen Prozedur aufrufen oder?
Lg tetris84
Nersgatt - Mo 19.12.11 16:27
Ich glaub wir reden in der Tat aneinander vorbei. Mach mal ein konkretes Beispiel.
zuma - Mo 19.12.11 16:30
tetris84 hat folgendes geschrieben : |
Ne ihr versteht mich glaub ich falsch. Beide Proceduren sind zum Beispiel ButtonClick oder so. Die kann man ja (meines Wissens nach) nicht von einer anderen Prozedur aufrufen oder?
Lg tetris84 |
meinst du sowas:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure Button1Click(Sender : TObject); begin showmessage('Button eins geklickt'); end;
procedure Button2Click(Sender : TObject); begin showmessage('Button zwei geklickt'); end;
procedure Button3Click(Sender : TObject); begin Button2Click(Button2); end; |
tetris84 - Mo 19.12.11 16:33
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure Form1.OptionenButtonClick (Sender: TObject); Begin Array[5] := '1';
End;
procedure Form1.FormActivate(Sender: TObject); Begin If Array[5] = '1' Then ShowMessage ('Super ich kann auf die Variable von OptionButtonClick zugreifen!'); End; |
Und das hallt ohne das Array global zu deklarieren
Lg tetris84
Nersgatt - Mo 19.12.11 16:36
Dann deklarier das Array im Private-Teil des Formulars.
tetris84 - Mo 19.12.11 16:44
Aber ist es dann nicht trotzdem noch Global in der Form aufrufbar?
Nersgatt - Mo 19.12.11 16:46
Ja, innerhalb der Form. Das würde ich aber nicht "global" nennen. Diese Vorgehensweise ist (je nach Einsatzzweck) durchaus legitim.
jaenicke - Mo 19.12.11 16:48
tetris84 hat folgendes geschrieben : |
Aber ist es dann nicht trotzdem noch Global in der Form aufrufbar? |
Ja, innerhalb des Formulars kann man das so sehen. Aber anders geht es nicht. Und Sachen für die aktuelle Klasse (sprich hier das Formular) im private-Abschnitt zu deklarieren ist normal.
Zudem sollten ggf. andere Teile ebenfalls in Klassen und Units gekapselt werden. Insofern ist es ja nicht wirklich global, sondern nur für diesen Teil der GUI global. Aus anderen Units kommst du ja z.B. nicht heran. ;-)
tetris84 - Mo 19.12.11 17:05
Nachdem ich es mal in Private geschrieben hab kommt der Fehler "Undeklarierter Bezeichner" Was habe ich falsch gemacht?
jaenicke - Mo 19.12.11 20:21
Dass deine Prozedur nicht zum Formular gehört vielleicht?
Sonst zeig mal den Quelltext dazu, raten ist nicht so gut...
tetris84 - Mo 19.12.11 21:13
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| private
type TStelle=record Vorhanden : boolean; Stückzahl:String; end; TArray = array [0..100] of TStelle;
var Verkauf : TArray;
public end;
procedure Pruefen (); Begin Verkauf[55].Vorhanden := true; End; |
Yogu - Mo 19.12.11 21:26
Die Variable heißt
Verkauf, aber du versuchst, über
Array darauf zuzugreifen. Das wird die Fehlermeldung auslösen.
Außerdem halte ich es für verwirrend, einen Typ namens
TArray zu deklarieren, der 101 Records aufnehmen kann. Wenn du einen solchen Typ tatsächlich öfter brauchst, solltest du ihn entsprechend benennen. Ansonsten kannst du ihn auch direkt bei der Variablendeklaration angeben:
Delphi-Quelltext
1:
| var Verkauf: array[0..100] of TStelle |
tetris84 - Mo 19.12.11 21:28
Ne das war jetzt nur son kleines Beispiel. Das ist so mein Quelltext in Kurzform.
Inklusive diesem Fehler. Der ist im echten Programm nicht. Hab die Variablen nämlich einfach nur in private kopiert.
jaenicke - Mo 19.12.11 23:22
tetris84 hat folgendes geschrieben : |
Delphi-Quelltext 1: 2:
| procedure Pruefen (); Begin | |
Da hatte ich ja Recht. ;-)
jaenicke hat folgendes geschrieben : |
Dass deine Prozedur nicht zum Formular gehört vielleicht? |
Mach daraus eine Methode des Formulars, dann klappt das auch.
Das ist ja genau der Sinn darin, die Variable als privates Feld zu deklarieren. Du kommst dann eben auch nur aus dem Formular und dessen Methoden heran.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!