AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Arbeiten mit mehreren Formularen

Ein Thema von sanobub · begonnen am 23. Aug 2004 · letzter Beitrag vom 23. Aug 2004
Antwort Antwort
sanobub

Registriert seit: 15. Jul 2004
9 Beiträge
 
#1

Arbeiten mit mehreren Formularen

  Alt 23. Aug 2004, 17:09
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:
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)
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!

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
  Mit Zitat antworten Zitat
Benutzerbild von Nothine
Nothine

Registriert seit: 3. Jul 2004
Ort: Mülheim an der Ruhr
198 Beiträge
 
Delphi 5 Enterprise
 
#2

Re: Arbeiten mit mehreren Formularen

  Alt 23. Aug 2004, 17:14
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.
if ThisPost is senseless then
ThisPost.WasPostedBy := SomeoneElse();
  Mit Zitat antworten Zitat
sanobub

Registriert seit: 15. Jul 2004
9 Beiträge
 
#3

Re: Arbeiten mit mehreren Formularen

  Alt 23. Aug 2004, 17:38
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?
  Mit Zitat antworten Zitat
roderich
(Gast)

n/a Beiträge
 
#4

Re: Arbeiten mit mehreren Formularen

  Alt 23. Aug 2004, 18:03
hallo sanobub,

so ganz kann ich dir nicht folgen, was die Abhängigkeiten deiner Units betrifft...

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
  Mit Zitat antworten Zitat
Benutzerbild von Nothine
Nothine

Registriert seit: 3. Jul 2004
Ort: Mülheim an der Ruhr
198 Beiträge
 
Delphi 5 Enterprise
 
#5

Re: Arbeiten mit mehreren Formularen

  Alt 23. Aug 2004, 18:36
Zitat von sanobub:
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?
also wenn ich das richtig verstanden hab erstellst du im source von unit2 eine instanz deiner klasse tspielfeld, der du (innerhalb von unit2) form2 als parent zuweist. damit besteht keine veranlassung mehr für dich unit2 in die unit von tspielfeld einzubinden.

vielleicht postest du auch mal ein paar code-schnipsel des verständnisses wegen
if ThisPost is senseless then
ThisPost.WasPostedBy := SomeoneElse();
  Mit Zitat antworten Zitat
sanobub

Registriert seit: 15. Jul 2004
9 Beiträge
 
#6

Re: Arbeiten mit mehreren Formularen

  Alt 23. Aug 2004, 19:17
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:
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?
Delphi-Quellcode:
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.
Form2 als nacktes Formular!

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;
  Mit Zitat antworten Zitat
Benutzerbild von Nothine
Nothine

Registriert seit: 3. Jul 2004
Ort: Mülheim an der Ruhr
198 Beiträge
 
Delphi 5 Enterprise
 
#7

Re: Arbeiten mit mehreren Formularen

  Alt 23. Aug 2004, 19:32
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 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? eigentlich sollte man ein stringgrid im constructor erstmal initialisieren...
if ThisPost is senseless then
ThisPost.WasPostedBy := SomeoneElse();
  Mit Zitat antworten Zitat
sanobub

Registriert seit: 15. Jul 2004
9 Beiträge
 
#8

Re: Arbeiten mit mehreren Formularen

  Alt 23. Aug 2004, 19:43
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?
  Mit Zitat antworten Zitat
Benutzerbild von Nothine
Nothine

Registriert seit: 3. Jul 2004
Ort: Mülheim an der Ruhr
198 Beiträge
 
Delphi 5 Enterprise
 
#9

Re: Arbeiten mit mehreren Formularen

  Alt 23. Aug 2004, 19:47
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

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
if ThisPost is senseless then
ThisPost.WasPostedBy := SomeoneElse();
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz