Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - TForm1-Prozeduren in einer anderen Unit


beastofchaos - So 27.03.11 23:47
Titel: TForm1-Prozeduren in einer anderen Unit
Hallo Leute, ich arbeite zur Zeit sehr intensiv mit Delphi und probiere vieles aus.
Jetzt stellt sich für mich die Frage bei einem Spiel:

Kann ich in uses auf eine andere Unit verweisen, die den Typen TForm1 und untergeordnete Prozeduren enthält und ich müsste in der richtigen Form nur angeben, dass es TForm1 ist.

Also ich hab jetzt meine Form vor mir, erstelle einen Button und die prozedur OnClick liegt aber in dieser sekundären Unit. Glaubt ihr das geht. Da ich gerade an einem Spiel arbeite und ich mehrere Versionen davon entwickeln möchte, versuche ich in uses auf die Unit mit den ganzen Prozeduren/Funktion zu verweisen, die alle Rechnungen beinhalten.

Bei der Unit der 1. Form müsste ich dann nur angeben, dass meine 1. Form dieser Typ ( der in der anderen Unit liegt ) ist.



Freue mich auf Antworten - Grüße, ein Delphi-begeisterter User


Robert.Wachtel - Mo 28.03.11 00:20

Löse Dich von der Begrifflichkeit "andere Unit" und beschäftige Dich mit Grundlagen der objektorientierten Programmierung sowie Schichtentrennung.

Selbstverständlich können Eigenschaften, Methoden und Prozeduren von Instanzen anderer Klassen (die dann in der selben Unit, in anderen Units oder gar in anderen Projekten liegen) - entsprechende Sichtbarkeit vorausgesetzt - verwendet werden.


jaenicke - Mo 28.03.11 05:45

user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
Also ich hab jetzt meine Form vor mir, erstelle einen Button und die prozedur OnClick liegt aber in dieser sekundären Unit. Glaubt ihr das geht.
Gehen ja, sinnvoll ist das aber nicht.

Stattdessen solltest du die Oberfläche von den dahinterliegenden Daten usw. trennen. Das heißt du hast Objekte und Methoden, die deine Logik und Daten beinhalten und rufst diese in OnClick auf. Damit ist der Code in OnClick und anderen Events der Oberfläche kurz, aber du hast keinen Code der Oberfläche irgendwo anders als in der Oberfläche.


beastofchaos - Mo 28.03.11 08:19

Jep, ich hab mich inzwischen shcon dafür entschieden, dass die Spielgrundlagen ganz normal im Quelltext stehen, aber im OnCreate von der Form les ich mit einer speziellen Prozedure ( kommt noch ) die Inhalte für die Levels aus einzelnen Text-Dateien. Zwar sehr mühsam, aber so könnte auch ein Laie die entsprechenden Hindernisse und ähnliches im Level platzieren


beastofchaos - Mo 28.03.11 16:44

So, ich habe schon einiges geschafft. Ich kann inzwischen schon Datei beschreben und erstellen, aber ich versuche gerade aus einer Textdatei Informationen zu lesen - hab mal gegooglet und viele meinten:
Read(t: Textfile, s: String); Das heißt er speichert den Inhalt der Datei in einem String. Nun kommt immer, wenn ich das per OnClick machen will: "I/O Error 32."
hne Read funktioniert alles, also muss es iwie daran liegen - weiß jemand Rat?
Hier Quelltext:

Es gibt neben dem Button noch übrigens:
Edit1 um den Inhalt zu lesen, der in der Datei gespeichert wird,
Edit2 um den Namen der Datei zu ermitteln und
Label2, in der der Inhalt der Textdatei stehen soll.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
var
  Form1: TForm1;
  f: textfile;
  text, filename, path, OutText: string;
.
.
.
procedure TForm1.Button1Click(Sender: TObject);
begin
  if (Edit1.Text <> ''and (Edit2.Text <> ''then
    begin
    path := ExtractFilePath(Application.ExeName);
    fileName := path + Edit2.Text + '.MGo';
    text := edit1.text;
    assignfile(f,filename);
    if not FileExists(filename) then
      rewrite(f);
    append(f);
    writeLn(f, text);
    read(f, OutText);
    Label2.caption := OutText;
    closefile(f);
    end;
end;

end.



Freue mich auf Rat, Grüße Thomas


Edit: Hat sich erledigt - Delphi Basics hat geholfen: Ich muss vor Read noch "FileMode := fmOpenRead" und "Reset(f)" setzen ;)


jaenicke - Mo 28.03.11 16:53

user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
    if not FileExists(filename) then
      rewrite(f);
    append(f);
Erst Rewrite und dann Append ist keine gute Idee, da fehlt ein else. ;-)


beastofchaos - Mo 28.03.11 23:41

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
    if not FileExists(filename) then
      rewrite(f);
    append(f);
Erst Rewrite und dann Append ist keine gute Idee, da fehlt ein else. ;-)


Funktioniert einwandtfrei - "rewrite()" erstellt doch die Datei und mit "append()" öffne ich sozusagen die Datei. Von der Reihenfolge stimmts :p


jaenicke - Mo 28.03.11 23:56

user profile iconbeastofchaos hat folgendes geschrieben Zum zitierten Posting springen:
Funktioniert einwandtfrei - "rewrite()" erstellt doch die Datei und mit "append()" öffne ich sozusagen die Datei. Von der Reihenfolge stimmts :p
Da irrst du dich. Siehe Hilfe. Rewrite öffnet die angegebene Datei zum Schreiben, wobei diese vorher geleert wird, wenn diese schon existiert, ansonsten wird diese neu erstellt.

In jedem Fall ist die Datei aber danach zum Schreiben geöffnet.

Daher rührt dann auch die Fehlermeldung, denn wie du sicher in der Doku bereits nachgelesen hast, heißt der I/O-Fehlercode 32, dass die Datei bereits geöffnet ist und daher nicht erneut geöffnet werden kann...


beastofchaos - Di 29.03.11 17:10

Es funktinierte auch wegen etwas anderem - ich habe im Moment noch es so da stehen und es funktioniert (??), aber danke für den hinweise werde es sofort korrigieren


jaenicke - Di 29.03.11 17:17

Wenn die Datei bereits existiert, geht es ja auch. Denn dann wird dein Rewrite ja nicht aufgerufen. ;-)