Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Objekt Werte von MainForm in Unit2 übergeben, gehts kürzer?


Xearox - Sa 20.03.10 00:33
Titel: Objekt Werte von MainForm in Unit2 übergeben, gehts kürzer?
Also, meine Frage ist hier, wie kann ich Folgenden Code in Unit2 Verkürzen?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure RessProWave;
begin
  if not (Main.Form1.PBGold.Position=0then
    begin

    end;
end;


Ich will den Wert der Position der ProgressBar aus meiner Main Unit in der Unit2 Verwenden.
Ich habe hier in irgendeinen Thread gelesen, das man sowas in Public schreiben muss, jedoch komm ich da nicht weiter, da steht immer wieder, das der name PBGold nicht deklariert sei.
Also habe ich das so wie oben Probiert, so geht es, aber ich finde das einfahc zu lang, ich denke das es Kürzer geht, jedoch weiß ich nicht wie, kann mir hier jemand helfen?


jaenicke - Sa 20.03.10 00:42

Dafür deklariere am besten ein Ereignis. Direkt auf Interna des zweiten Fensters so zuzugreifen ist unnötig kompliziert und unübersichtlich.


Xearox - Sa 20.03.10 00:50

Meinst du, das ich die Position der Progressbar als Variable in der MainUnit Festlegen soll, und diese dann in Unit2 verwenden soll?

Also Beispiel

MainUnit

Delphi-Quelltext
1:
GoldVorrat:=PBGold.Position;                    


jaenicke - Sa 20.03.10 01:00

Wenn, dann an die zweite Unit übergeben:

Delphi-Quelltext
1:
2:
3:
4:
procedure MachMist(Value1: String; ProgressDisplay: TProgressBar);
begin
  ProgressDisplay.Position ...
end;
Das meinte ich zwar nicht, geht aber natürlich auch, ist halt nur nicht ganz so elegant.


Delete - Sa 20.03.10 02:30

Beides ist schlecht. Warum nicht auf die Daten und/oder Ereignisse zurückgreifen von denen auch die Fortschrittanzeige ihre Daten erhält?


Xearox - Sa 20.03.10 02:51

wie meinst du das genau?


ffgorcky - So 21.03.10 14:52

Also ich denke mal, dass Du das hier so weißt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
type
  TForm1 = class(TForm)
    //hier kommen dann die ganzen Komponenten hin, die Form1 enthält.
  private
    Wert:String;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    //Und hier können dann Deine Prozeduren und Funktionen hin, auf die Du von einer anderen Unit aus zugreifen möchtest - z.B. auch solch eine Funktion:
    function WertAusForm1():String;
  end;

public function TForm1.WertAusForm1():String;
begin
WertAusForm1:=Wert;
end;

Dann könntest Du aus Deiner Form2 doch so darauf zugreifen:

Delphi-Quelltext
1:
meinWertAusForm1:=Form1.WertAusForm1();                    

Oder möchtest Du da doch wirklich direkt drauf zugreifen? - Dann müsstest Du doch einfach nur das Ganze so schreiben, indem Du Deinen Wert eben wirklich als public definierst:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
type
  TForm1 = class(TForm)
    //hier kommen dann die ganzen Komponenten hin, die Form1 enthält.
  private
    { Private-Deklarationen }
  public
    Wert:String;
    { Public-Deklarationen }
  end;

Dann heißt die Abfrage aus Form2 so:

Delphi-Quelltext
1:
meinWertAusForm1:=Form1.Wert;                    


Oder habe ich das ganze jetzt als zu einfache Fragestellung verstanden?
Dann entschuldigt...
Ich sehe ja gerade, 138 Beiträge können nicht mal eben von einem Neuling sein.


Xearox - So 21.03.10 15:46

ich lerne halt dazu.
Ich versuche erst ein Problem zu lösen, bevor ich das nächste anpacke.
Wenn ich irgendwas nicht verstehe, google ich danach, und versuch irgendwelche Tutorials darüber zu finden.


Also ich habe mehrere Units.
In der MainUnit erstelle ich Objekte auf der Form, die ich in den anderen Units verwenden möchte, wie zum Beispiel die ScrollBar, welche ich nutze, grafisch dazustellen, wie viele Ressourcen noch zum Abbauen vorhanden sind. Nun ist das so, das ich in der Unit Buildings dies so geschrieben hab: GoldVorrat:=Main.Form1.PBGold.Position;

die ScrollBar hab ich in der Form1 "PBGold" genannt, Buildings hat keine Form, ist einfach eine Unit, welche ich dazu verwende, die MainUnit übersichtlicher zu machen. Also jede Funktion oder Procedure auszulagern.

Nun ist die Frage, wie kann ich die ScrollBar, welche den namen PBGold hat, in der Unit Buildings, auch als PBGold verwenden kann, und nicht immer schreiben muss "Main.Form1.PBGold.Position".

weil wenn ich die in Public verschiebe, macht delphi Probleme, und meckert rum. (Also das hier in Public verschieben "ScrollBar1: TScrollBar;" und "procedure ScrollBar1Change(Sender: TObject);")