![]() |
Arbeiten mit mehreren Formularen
Hallo,
ich arbeite zur Zeit an einem für meine Verhältnisse komplexen Projekt, das mehrere Units umfasst. Daher stellen sich mir immer neu Fragen, die den Aufbau und die Struktur meines Programmes betreffen! Mein Programm besteht vereinfacht aus drei Formularen
Delphi-Quellcode:
Mein Problem besteht jetz darin, dass ich nicht weiß, wie ich am sinnvollsten meine selbstgeschriebenen Units in das Programm einbinde und welchen Hauptunits (Unit1-Unit3) ich sie zur Verfügung stellen soll!
Unit1 (Form1) : Programmübersicht mit 2 Buttons zum Anzeigen von Form2 und Form3
Unit2 (Form2) : Spielfeld benutzen Unit3 (Form3) : Spielregeln einstellen Folgende Units habe ich bereits geschrieben. In Klammen die darin enthaltenden Klassen Unit1, Unit2, Unit3 mit den Formularinstanzen Spielfeld (TSpielfeld, TFeld, TSchiff) Spielregel (TSpielregel) Ist es unbedingt nötig, dass ich TSpielfeld als Feld ihres Formulars deklariere (unter public)? Das ist störend, weil ich ständig Komponenten des Formulars (Edit, Listboxen, Buttons) beim Erstellen des Objekts Spielfeld übergeben muss, um darauf zuzugreifen. Oder soll ich besser die Objekte Spielfeld und Spielregel in Unit1 als globale Variablen deklarieren und erstellen? Dann könnte ich Unter TSpielfeld auch direkt auf Form2 und dessen Komponenten zugreifen, indem ich Unit2 mit uses einbinde. Gruß, Sandro |
Re: Arbeiten mit mehreren Formularen
das kommt ganz drauf an ob du dein spiel (das du ja scheinbar programmierst) weiterverwenden willst. wenn du die spielfeld und spielregel units nur innerhalb dieses programms benötigst und dir sowieso sagst dass du das nächste spiel wieder komplett neuschreibst dann erstell die entsprechenden funktionen direkt in unit1 (bzw. der hauptunit), da der zugriff auf die komponenten der formulare dann natürlich einfacher ist.
|
Re: Arbeiten mit mehreren Formularen
Okay, das leuchtet mir ein!
Aber ist es denn überhaupt erlaubt, dass ich Unit2 (in der sich ja auch Form2 befindet) in die Unit Spielfeld (mit TSpielfeld) einbinde, wenn eine Instanz von TSpielfeld als Parent Form2 hat? Sorry, aber finde keinen Weg das einfacher auszudrücken. Warum mir das so fraglich erscheint kommt daher, weil TSpielfeld von TPanel vererbt wird und das erzuegte Objekt auf Form2 liegt. Darf TSpielfeld dann selbst auf Unit2 und damit auch auf Form2 und dessen Komponeten zugreifen? |
Re: Arbeiten mit mehreren Formularen
hallo sanobub,
so ganz kann ich dir nicht folgen, was die Abhängigkeiten deiner Units betrifft... :roll: Nur ein Tip (nicht nur für dich hier im Forum): Nenne deine Units und Formulare von Anfang an sinnvoll (z.B. frmGame, frmOptions statt Form1, Form2 etc.). Ebenso alle Komponenten, auf die du im Quellcode zugreifst (z.B. btnPlay statt Button1). Spätestens wenn du (oder jemand anderes) dein Projekt nach 6 Monaten Pause weitermachst, wirst du froh darüber sein. Gruß Roderich |
Re: Arbeiten mit mehreren Formularen
Zitat:
vielleicht postest du auch mal ein paar code-schnipsel des verständnisses wegen :zwinker: |
Re: Arbeiten mit mehreren Formularen
Hallo,
nun gibts Quellcodefetzen zum besseren Verständnis! Also ich würde da nicht durchsteigen an eurer Stelle ;) Aber wers sich antun möchte, kann das natürlich gerne! Meine Frage nach wie vor: Zitat:
Delphi-Quellcode:
Form2 als nacktes Formular!
unit Unit1;
interface uses Unit2, Unit3, Spielfeld, Spielregel; type TForm1 = class(TForm) BitBtn1: TBitBtn; procedure BitBtn1Click(Sender: TObject); end; var Form1: TForm1; Spielfeld1: TSpielfeld; implementation {$R *.dfm} procedure TForm1.BitBtn1Click(Sender: TObject); begin Spielfeld1:= TSpielfeld.Einrichten(Self, Spielregel); //Spielregel ist globale Variable in Unit3 Form2.Show; end; end.
Delphi-Quellcode:
unit Unit2;
interface type TForm2 = class(TForm) end; var Form2: TForm2; implementation {$R *.dfm} end.
Delphi-Quellcode:
unit Spielfeld;
interface uses Unit2, Schiffe, Felder, Spielregel; type TSpielfeld = class(TPanel) public constructor Einrichten(aMainFrame : TForm; aSpielregel : TSpielregel); procedure NewSchiff(aSchiff : TSchiff); procedure AutoSchiffCreate; procedure Show; function Angriff(ax_cor, ay_cor : word) : integer; function IsFeldInUse(aFeld : TFeld) : TSchiff; procedure OnFeldMouseDown(Sender: Tobject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure OnFeldMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure OnFeldEndDrag(Sender, Target: TObject; X, Y: Integer); procedure OnFeldDragDrop(Sender, Source: TObject; X, Y: Integer); procedure OnFeldDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); private Feld: array of array of TFeld; Schiff : array of TSchiff; Schiff_neu : TSchiff; Schiff_anz : word; Regel : TSpielregel; end; implementation constructor TSpielfeld.Einrichten(aMainFrame : TForm; aSpielregel : TSpielregel); var a,b : integer; begin inherited Create(Form2); Parent := Form2; Regel := aSpielregel; Regel.Show(Form2.StringGrid1); //Spiefeld-Aussehen Left := 50; Top := 50; Color := clwhite; BevelOuter := bvnone; BevelInner := bvnone; Width := Regel.Feldgroesse * Regel.felder_x; Height := Regel.Feldgroesse * Regel.Felder_y; // Aussehen Form2 Form2.StringGrid1.Left := Self.Left + Self.Width + 20; Form2.Memo1.Width := Self.Left + Self.Width - Form2.Memo1.Left; Form2.edit5.Width := Self.Left + Self.Width - Form2.Edit5.Left; Form2.Memo1.Top := Self.top + Self.height + 20; Form2.Edit5.Top := Form2.Memo1.Top + Form2.Memo1.Height + 5; // ClientHeight/Width gibt die tatsächliche Nutzfläche eines Formulars an! Form2.ClientHeight := Form2.Edit5.Top + Form2.Edit5.Height; Form2.ClientWidth := 2 * Self.Left + Self.Width + Form2.StringGrid1.Width; SetLength(Feld,Regel.felder_x+1,Regel.felder_x+1); for a := 1 to Regel.felder_x do for b := 1 to Regel.felder_y do begin Feld[a,b] := TFeld.Erstellen(Self, Regel.Feldgroesse, a,b); Feld[a,b].OnMouseDown := OnFeldMouseDown; Feld[a,b].OnMouseMove := OnFeldMouseMove; Feld[a,b].OnDragOver := OnFeldDragOver; Feld[a,b].OnDragDrop := OnFeldDragDrop; Feld[a,b].OnEndDrag := OnFeldEndDrag; end; end; |
Re: Arbeiten mit mehreren Formularen
also als ersten tipp für dich hätt ich folgendes, wenn du schon als constructor-parameter eine form übergibst, diese dann auch zu benutzen :roll: :wink: dann kannst du nämlich die referenz auf unit2 schonmal weglassen. außerdem ne andere sache, ich frage mich inwieweit du den sinn des constructors nicht überstrapaziert hast indem du so ziemlich jede mögliche einstellung direkt im constructor aufrufst, wobei vor allem dinge wie SetBounds eigentlich dort nichts zu suchen haben... und noch was anderes, wie kommst du eigentlich auf die idee das ein TStringGrid mit der bezeichnung StringGrid1 zweifelsfrei existiert? :gruebel: eigentlich sollte man ein stringgrid im constructor erstmal initialisieren...
|
Re: Arbeiten mit mehreren Formularen
Der Parameter MainFrame (eigentlich ists nen Formular) ist nicht das selbe Formular wie Form2. Mainframe übergebe ich nur um es zu disablen (ist noch nicht implementiert)
Und die ganzen Sachen die ich dort im Constructor erledige können eigentlich gar net ausgelagert werden, weil der Panel (Spielfeld) dort mehrere Felder bekommt! Außerdem wird abhängig davon, wie groß das Spielfeld in TSpielregel gewählt wurde, das Forumlar angepasst (Größe) auf dem der Panel liegt. Wenns da ne bessere Lösung gibt, bin ich für kontruktive Beiträge immer offen! Aber wieder zurück zu meiner eigentlichen Frage! Ist es nicht eigentlich nen dirty-trick einfach auf Form2 zuzugriefen, obwohl der Panel (Spielfeld) selbst nen Objekt von Form2 ist? |
Re: Arbeiten mit mehreren Formularen
ok solang ich nich den gesamten quelltext hab kann ich natürlich nur kommentieren was ich vorliegen hab, also beantworte ich halt erstmal nur deine letzte frage :mrgreen:
doch es ist dirty, eben deswegen weil TSpielfeld auf diese art und weise nicht eigenständig in andere projekte eingebunden werden kann, außer sie werden 100%ig exakt so wie deines aufgebaut, was aber nich sinn und zweck von komponenten is :roll: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz