Autor Beitrag
JRegier
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: Fr 08.07.05 08:21 
Hallo, ich verwende zum ersten mal Frames! Aber sagt mal warum gibts da das Ereignis nicht OnCreate? Ich muß doch irgendwas initialisieren können oder screib ich einfach ein constructor? Na ja so hab ich es bei Componentenentwicklung gemacht!
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Fr 08.07.05 08:35 
Das frage ich mich auch immer warum die kein OnCreate haben. Aber Borland wird da mit Sicherheit einen Grund für haben. bestimmt. ;-)

Du kannst dafür den Konstruktor überschreiben. Der ist virtuell und somit wird sichergestellt, dass der dann auch aufgerufen wird. Einen nicht virtuellen Konstruktor solltest du nicht machen, da der nicht aufgerufen wird. Delphi erstellt die Frames ja normal automatisch und dazu wird immer der Virtuelle benutzt.

Eine andere Möglichkeit wäre die Procedure AfterConstruction. Die ist ebenfalls virtuell und wird bereits von TObjekt implementiert. Also musst du diese auch überschreiben. Diese wird vom Konstruktor aufgerufen. Das Gegenstück dazu ist BeforeDestruction.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
JRegier Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: Fr 08.07.05 09:48 
user profile iconLossy eX hat folgendes geschrieben:
Das frage ich mich auch immer warum die kein OnCreate haben. Aber Borland wird da mit Sicherheit einen Grund für haben. bestimmt. ;-)

Du kannst dafür den Konstruktor überschreiben. Der ist virtuell und somit wird sichergestellt, dass der dann auch aufgerufen wird. Einen nicht virtuellen Konstruktor solltest du nicht machen, da der nicht aufgerufen wird. Delphi erstellt die Frames ja normal automatisch und dazu wird immer der Virtuelle benutzt.

Eine andere Möglichkeit wäre die Procedure AfterConstruction. Die ist ebenfalls virtuell und wird bereits von TObjekt implementiert. Also musst du diese auch überschreiben. Diese wird vom Konstruktor aufgerufen. Das Gegenstück dazu ist BeforeDestruction.


Ok, einfachh virtual davor schreiben? Ich habe nur ein wenig C++ gepauckt!

Eine andere Frage: Wie setze ich ein Frame auf ein PageControl/TabSheet?
Quivadis
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 314

UBUNTU 9.04
D2005 PERS, JAVA, D7 Pers.
BeitragVerfasst: Fr 08.07.05 10:18 
Habe auch Probleme mit den Frames.

Wie muss der Quelltest des Konstraktors ausehen, wenn man ihn überschreiben will?

_________________
Wissen ist macht, nichts wissen macht auch nichts. ODER: Wer nichts weis, kann nichts vergessen.
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Fr 08.07.05 10:27 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
TMyFrame = class (TFrame)
public
constructor Create (AOwner : TComponent); override;
end;

TMyFrame.Create (AOwner : TComponent);
begin
  inherited Create (AOwner);
  {hier deinen code einbauen}
end;


oder wenn du andere parameter brauchst

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
TMyFrame = class (TFrame)
public
constructor Create (AOwner : TComponent; AStartParam : Integer); reintroduce;
end;

TMyFrame.Create (AOwner : TComponent; AStartParam : Integer);
begin
  inherited Create (AOwner);
  {hier deinen code einbauen
  case AStartParam of
    1:;
    2:;
  end;
  }

end;



viele grüße
alex
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Fr 08.07.05 10:31 
Äh. Nein. Die Konstruktoren sind bereits virtuel. Und in Delphi musst du diese dann überschreiben.

So ist der Konstruktor der Basiskomponente TComponent implementiert.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  // Basiskonstruktor
  TComponent = class(...)
  public
    constructor Create(AOwner: TComponent); virtual// Konstruktor als virtuelle Methode
    ...
  end;


So müsste das in eurem Form, Frame oder was auch immer für ner Komponente aussehen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
  // Form Frame etc.
  TForm1 = class(TForm)
  public
    constructor Create(AOwner: TComponent); override;
    ...
  end;

implementation


constructor TForm1.Create(AOwner: TComponent);
begin
  // Wichtig! Inherited ruft den vorherigen Konstruktor auf.
  inherited;

  // Mach was
end;


Da das ein Fundamentaler Bestandteil von Objekt orientierter Programmierung ist rate ich euch dringlichst zu einem Tutorial in dem das ausführlich erklärt wird.

[edit] Oh. Doppel gemoppelt.

@reintroduce: Damit wäre ich vorsichtig. Das funktioniert nur, wenn du die Objekte manuell erstellst. Sobald man dieser aber von Delphi erstellen lässt (bei Forms nicht unüblich) dürfte das Ergebniss spannend werden. In denke nämlich mal, dass Delphi dann einfach einen älteren Konstruktor benutzt und den neuen einfach so weg lässt. Also Vorsicht damit.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Quivadis
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 314

UBUNTU 9.04
D2005 PERS, JAVA, D7 Pers.
BeitragVerfasst: Fr 08.07.05 10:40 
Ich lerne gerade JAVA , und dachte das die Grundlagen in OOP ja eigentlich gleich sind, nur halr die Befehle etwas anders. Delphi verwirt mich hier etwas. Brauche Delphi, aber für arbeit.

Das frame um welches es mir geht liegt schon auf der Form drauf. Nur eigentlich möchte ich es mit einen Aufrufparameter initialiesieren. <- dachte das geht mit dem Konstraktor

Weil es bei mir aber schon erzeugt ist, habe ich mir Function/Proceduren geschrieben, die die interne Abarbeitung in meinen Frame starten sollen. Diese sind alle public. <- sehe sie aber nicht während ich programmiere, erscheinen nicht nach name. Keine Ahnung warum. Wenn das gehen würde, wäre es besser für mein Programm.

Wie kann man das machen in einem frame. Ein oncreate gibt es ja leider nicht.

_________________
Wissen ist macht, nichts wissen macht auch nichts. ODER: Wer nichts weis, kann nichts vergessen.
JRegier Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: Fr 08.07.05 10:44 
user profile iconQuivadis hat folgendes geschrieben:
Ich lerne gerade JAVA , und dachte das die Grundlagen in OOP ja eigentlich gleich sind, nur halr die Befehle etwas anders. Delphi verwirt mich hier etwas. Brauche Delphi, aber für arbeit.


Hey Kumpel, nur so nebenbei, ich habe auch Java programmiert und jetzt seit 2,5 Monaten Delphi!

Sag mal, Java war doch besser oder?
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Fr 08.07.05 10:57 
user profile iconQuivadis hat folgendes geschrieben:
Das frame um welches es mir geht liegt schon auf der Form drauf. Nur eigentlich möchte ich es mit einen Aufrufparameter initialiesieren. <- dachte das geht mit dem Konstraktor

Bei herkömmlichen Klassen ja. Aber bei Komponenten ist das nicht so einfach, da diese nun mal automatisch erzeugt werden.

Wie gesagt. Du kannst auch den Konstruktor überschreiben und Parameter hinzufügen. Dann musst du das Frame aber manuel im OnCreate des Forms erzeugen. Anderenfalls sollte es genügen, wenn du eine Methode schreibst du das Frame initialisiert. Dann müsstest du diese im OnCreate aufrufen. So könntest du das Frame dann auch zur Designzeit schon verwenden. Warum das bei dir nicht geht kann ich so auf blauen dunst natürlich nicht sagen. Da musste schon mal Code zeigen.

Zitat:
Wie kann man das machen in einem frame. Ein oncreate gibt es ja leider nicht.

Auch für dich noch mal...
- Konstruktor oder AfterConstructiorn überschreiben.
- Falls du zusätzliche Parameter benötigst hast du keine andere Wahl als diese von außen per zusätzlicher Methode rein zu reichen.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Quivadis
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 314

UBUNTU 9.04
D2005 PERS, JAVA, D7 Pers.
BeitragVerfasst: Fr 08.07.05 10:57 
Java ist etwas übersichtlicher und hat nicht so alten Ballast wie Delphi.
Was besser oder schlechter ist kann man so nicht sagen. Beide Sprachen können sehr viel. Delphi, sprich object Pascal oder neuerdings delphi language ist älter, und sollte den Studenten die Stukturierte Programmierung beibringen. Borland hat die Sprache ständig erweitert, aber leider nix weggelassen.
Java ist erst ca. 10 Jahre alt. Also noch relativ jung. Ist aber im Gegensatz zu Delphi zu 100% objektorientiert. Man muss sich also damit beschäftigen.

In Delphi programmiere ich schon eine ganze Weile, weil aber Delphi auch die alte Art der Strukturierten Programmierung zulässt und vieles automatisch erzeugt habe ich mich mit diesen Thema (OOP)erst im Zuge vom Java lernen genauer beschäftigt.

Java erscheint mir beim Thema OOP leichter zu sein.

Aber nun wieder zurück zum eigentlichen Thema:

Wie kann man einen Frame, wenn er erzeugt wird, oder später noch Parameter übergeben?

_________________
Wissen ist macht, nichts wissen macht auch nichts. ODER: Wer nichts weis, kann nichts vergessen.
Quivadis
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 314

UBUNTU 9.04
D2005 PERS, JAVA, D7 Pers.
BeitragVerfasst: Fr 08.07.05 11:14 
@Lossy eX: Das mit dem Konstruktor überschreiben geht nicht, da die Komponente schon sichtbar sein muss, wenn der eigentlich Parameter noch gar nicht feststeht.

Dachte ich kann, wenn ich die Methoden in den Frame schreibe, auf diese dann zugreifen, wenn das Frame auf der Form liegt. Ich will ja nur in eine ImageKompente welche in Frame dann automatisch erzeugt wird sagen, welches Bild sie anzeigen soll. Das kann doch nicht so schwer sein? Als Programm hat alles Funktioniert, jetzt compilation ohne Fehler, Laufzeit erzeugt aber beim aufruf dier Bild-Zuweisung Methode einen Laufzeitfehler (Debuger meldet sich nicht!) 'Zugriffsfehler beim Lesen an Adresse xxx...'.

Ich verzweifel noch.

_________________
Wissen ist macht, nichts wissen macht auch nichts. ODER: Wer nichts weis, kann nichts vergessen.
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Fr 08.07.05 11:28 
Du kannst in einem Frame Methoden implementieren auf die du zugreifen kannst. Himmel du kannst sogar auch direkt auf die Komponenten eines Frames zugreifen und dort Eigenschaften ändern. Was natürlich unsauber ist und man nicht unbedingt machen sollte.

Aber ich kann mich nur noch einmal wiederholen. Ohne Code kann ich dir dabei nicht helfen! Ich weiß doch nicht was du falsch gemacht hast.

PS: Evtl. würde ich das ganze mal Debuggen um den Fehler selber mal eingrenzen zu können. Für mich deutet das nämlich darauf hin, dass dein Objekt noch nicht oder nicht mehr existiert. Aber im Debugger kannst du dich selber an das Problem herantasten. Einmal mal bei der Zuweisung schauen was wirklich passiert. Das ist ein echt nützliches Teil, wenn man es denn verwendet.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Quivadis
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 314

UBUNTU 9.04
D2005 PERS, JAVA, D7 Pers.
BeitragVerfasst: Fr 08.07.05 11:38 
Der Quelltext des Frames sind über 2000 Zeilen, und dann darf ich das hier leider auch nicht veröffentlichen. Ist ein Komerzielles Projekt. Leider, sonst gerne.

Ich versuche mich mal weiter an das Problem ranzutasten. Habe nach deinem letzten Post gerade eine Idee gehabt. Denke und hoffe mal das das die Lösung ist mit den Objekten. Habe sie ja frühe aller im oncreate der Form erzeugt, habe vielleicht doch noch welche vergessen umzuschreiben.

Danke Dir erstmal.

_________________
Wissen ist macht, nichts wissen macht auch nichts. ODER: Wer nichts weis, kann nichts vergessen.
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Fr 08.07.05 11:57 
Ahh. Ich wollte ja auch nicht den ganzen Code haben. Mir hätten schon markannte Stellen ausgereicht. Und das wären ganz normale Windowsprogrammierungn mit Delphi gewesenen. Und du hättest so die wichtigen Teile deines Projektes geheim halten können. Aber schaue erst mal ob du evtl selber etwas findest.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Quivadis
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 314

UBUNTU 9.04
D2005 PERS, JAVA, D7 Pers.
BeitragVerfasst: Fr 08.07.05 12:08 
Habe meinen Fehler noch nicht endeckt.

Hier mal der Code der Anwendung auf der der Frame liegt:
ausblenden volle Höhe 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:
27:
28:
29:
30:
31:
32:
33:
unit AnwFrameTest;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, FrameWunde, StdCtrls;

type
  TForm1 = class(TForm)
    Frame_Wunde1: TFrame_Wunde;
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   Frame_Wunde1.Bild_Laden('{105F1617-7643-4B9A-9B71-37687FC9B4BC}');
end;

end.


So jetzt mal die Markanten Teile finden.

Ersmal der Public Abschnitt im Frame:
ausblenden 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:
public
    { Public-Deklarationen }

    WundeArtGuid         : string;  // entspricht WUNDEMARKIERUNGART_NR


    function getFlaeche      : Extended;
    function getUmfang       : Extended;
    function getMassstab_pix : Integer;
    function getMassstab_cm  : Double;


    Procedure maxAusdehnung;
    Procedure Breite_Hoehe;

    Procedure init;   // damit es auch von woanders geht

    procedure Bild_Laden(StrGuid:String); // Markierungen löschen inkl. listen und Anzeige und Bild laden

    Function  GuidString : string;        // Guid erzeugen


  end;


und hier mal Teilweise die entsprechenden Methoden:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function TFrame_Wunde.getFlaeche() : Extended;
begin
  Result:=Flaeche;
end;

function TFrame_Wunde.getUmfang() : Extended;
begin
  Result:=Umfang;
end;

function TFrame_Wunde.getMassstab_pix() : Integer;
begin
  result := lmassstab_pix;
end;

function TFrame_Wunde.getMassstab_cm() : Double;
begin
  result := lmassstab_cm;
end;


Diese sind aber irgendwie nicht sichtbar in der Form.

Die Methode Bild_Laden ist zu umfangreich, diese ist aber Sichtbar. Sie verursacht aber auch denn Fehler.
Ich quälle mich da erstmal alleine durch.

Kannst mir ja erstmal die Fehler oben sagen. Die Fuktionen sollen Werte zurückgeben. Keine Ahnung wegen der Klammern.

_________________
Wissen ist macht, nichts wissen macht auch nichts. ODER: Wer nichts weis, kann nichts vergessen.
Quivadis
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 314

UBUNTU 9.04
D2005 PERS, JAVA, D7 Pers.
BeitragVerfasst: Fr 08.07.05 13:42 
Das die Mehtoden nicht sichtbar waren lag an Delphi. Nach Rechner Neustart sind sie vorhanden.

Die anderen Fehler enstanden wirklich nur weil ich auf Objekte zugegriffen habe die zu diesem Zeitpunkt im Frame noch gar nicht vorhanden waren.
Jetzt kann ich das Programm wenigstens starten.

So jetzt langsam Schritt für Schritt weiter debuggen.

_________________
Wissen ist macht, nichts wissen macht auch nichts. ODER: Wer nichts weis, kann nichts vergessen.