Autor Beitrag
Matclou
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Di 24.11.09 16:36 
Man stelle sich folgendes vor:

Ich habe zwei Units, eine Hauptunit und eine andere zum erzeugen einer Kuh [Bilddatei]. Das ist ja weithin bekannt als "Objektorientiertes Programmieren"....


Nun habe ich bereits eine funktionierende Version des Programmtext vorlesen und ich habe mir gedacht: Versuch ich das nochmal alleine von Hand, habe alles gemacht, was passiert: Nichts.

Dann habe ich mal den Programmiertext mit dem Text aus dem funktionierenden Programm verglichen und festgestellt und habe festgestellt: Sie sind vollkommen identisch!

Wo kann denn der Fehler dann liegen? Hinweis: Es scheint i-wie der Wechsel zwischen den Units nicht zu funktionieren. Anweiseungen aus der ersten Units (z.b. bei mir jetzt Hintergrundfarbe ändern) akzeptiert das Programm noch ohne zu murren, bei einem Klick "Kuh/Bilddatei" erzeugen, reagiert das Programm allerdings widerrum nicht...

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

[Warnung] mKuh.pas(15): Methode 'Create' verbirgt virtuelle Methode vom Basistyp 'TImage'

Das wird angezeigt...
Robert.Wachtel
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: Di 24.11.09 16:42 
user profile iconMatclou hat folgendes geschrieben Zum zitierten Posting springen:
[...] Ich habe zwei Units, eine Hauptunit und eine andere zum erzeugen einer Kuh [Bilddatei]. Das ist ja weithin bekannt als "Objektorientiertes Programmieren".... [...]

:dunce:

Zitat:
[...] [ ] [...]

Da ist wieder das Kristallkugelproblem: woher sollen wir wissen, was Du gemacht hast?

Zitat:
[...] Es scheint i-wie der Wechsel zwischen den Units nicht zu funktionieren. [...]

Was ist ein "Wechsel zwischen den Units"? Und was heisst "nicht funktionieren"?
Matclou Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Di 24.11.09 16:45 
Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

Mit Wechsel meine ich: Sobald die Hauptunit auf die Kuhunit zu greifen will. passiert nichts mehr.
D.h. es gibt einen Button, und bei einem Klick auf diesen sollte eben eigentlich eine Kuh erscheinen... Mom. ich poste den Text mal:
Hauptunit:
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:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
unit mHaupt; //version 1

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,mKuh; // mHaupt benutzt die in unit MKuh, muss hier angemeldet werden



type
  Tgui = class(TForm)
    BtNeueKuh: TButton;
    procedure FormActivate(Sender: TObject);
    procedure BtNeueKuhClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  gui: Tgui;
  Kuh:Tkuh; //Zugriffsvariable für ein neues Objekt
implementation

{$R *.dfm}



procedure Tgui.BtNeueKuhClick(Sender: TObject);
begin
Kuh:=TKuh.create(gui);//erzeugen der neuen Kuh, die der gui gehört
Kuh.Parent:=gui;

Kuh.Left:= random(gui.clientWidth-120);
Kuh.Top:=random(gui.clientheight-120);
Kuh.Show;
end;

procedure Tgui.FormActivate(Sender: TObject);
begin
randomize;
color :=$005B9D1B;
end;
end.


"Kuh"-Unit:

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:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
unit mKuh;  //version 1

interface
uses
ExtCtrls,Classes;

type
TKuh = class(TImage)

private
FFarbe:String;

{Private-Deklaration}
public
constructor create(Aowner:TComponent);

{Public-Deklarationen}
end;


implementation

constructor TKuh.create(Aowner:TComponent);
Var a:Integer;
begin
a:= random(4);
inherited create (Aowner);
case a of 0begin
             FFarbe := 'rot';
             picture.loadfromfile('Bilder/Fisch1.bmp');
             end;
             1begin
                FFarbe := 'gelb';
                picture.loadfromfile('Bilder/Fisch2.bmp');
                end;
                   2:begin
                     FFarbe := 'lila';
                     picture.LoadFromFile('Bilder/Fisch3.bmp');
                     end;
                         3begin
                            FFarbe := 'weiss';
                            picture.LoadFromFile('Bilder/Fisch4.bmp');
                            end;
                            

             end;
             transparent:=true;
             end;
end.


Moderiert von user profile iconKlabautermann: Code- durch Delphi-Tags ersetzt.
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Di 24.11.09 16:54 
Ich vermute, du hast folgendes selbst geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type
  Tgui = class(TForm)
    BtNeueKuh: TButton;
    procedure FormActivate(Sender: TObject);
    procedure BtNeueKuhClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;


Dann fehlt vermutlich die Zuordnung der Methoden zum Event. Wenn man in der Delphi IDE doppelt auf einen Knopf klickt wird nicht nur der Prozedur-Rumpf erstellt, sondern in der *.dfm Datei auch noch die Zuordnung vorgenommen.

Du hast jetzt entweder die Möglichkeit, die Methoden selbst zuzuordnen oder in der GUI doppelt auf die Komponenten zu klicken und evtl. den Code umzukopieren.

Zuweisen sähe z.B. so aus:

ausblenden Delphi-Quelltext
1:
2:
  Self.OnActivate := FormActivate;
  BtNeueKuh.OnClick := BtNeueKuhClick;
Matclou Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Di 24.11.09 16:57 
Oha, das hört sich richtig an, es kann sehr gut sein, dass ich da etwas gelöscht und wieder eingefügt habe usw....

Wo müsste das zuweisen denn passieren? Auch unter Type`?
Robert.Wachtel
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: Di 24.11.09 16:59 
user profile iconbaka0815 hat folgendes geschrieben Zum zitierten Posting springen:
[...] Du hast jetzt entweder die Möglichkeit, die Methoden selbst zuzuordnen oder in der GUI doppelt auf die Komponenten zu klicken [...]
Matclou Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Di 24.11.09 17:01 
user profile iconRobert.Wachtel hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconbaka0815 hat folgendes geschrieben Zum zitierten Posting springen:
[...] Du hast jetzt entweder die Möglichkeit, die Methoden selbst zuzuordnen oder in der GUI doppelt auf die Komponenten zu klicken [...]

Klar, habe ich gelesen ;)

Bedenke aber: Ich bin Anfänger, und nehme im Zweifel immer das einfachere... ;)

Und das klang jetzt so als wär es einfacher...

Meint er mit denn mit "auf die Komponenten klicken" das im Objektinspektor bei den Methoden??

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Ah, sehr gut, toll wie ihr sowas immer herausfindet^^

Ich habs mit dem Klick auf die methoden im Objektinspektor (bzw. auf die Kompenenten) probiert, es ging!

Ich danke euch allen für die schnelle und gute Hilfe! ;)
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Di 24.11.09 20:23 
[OT]Wieso heißt die Klasse Kuh, wenn sie Fische läd oO[/OT]

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Mi 25.11.09 08:18 
user profile iconMatclou hat folgendes geschrieben Zum zitierten Posting springen:
Wo müsste das zuweisen denn passieren? Auch unter Type`?

Das zuweisen würde ich immer unter FormOnCreate machen.
Also einfach einmal einen Doppelclick auf eine freie Fläche Deines Fensters, dann erscheint diese Procedure.
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Do 26.11.09 15:07 
user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconMatclou hat folgendes geschrieben Zum zitierten Posting springen:
Wo müsste das zuweisen denn passieren? Auch unter Type`?

Das zuweisen würde ich immer unter FormOnCreate machen.
Also einfach einmal einen Doppelclick auf eine freie Fläche Deines Fensters, dann erscheint diese Procedure.

Wollte ich auch erst schreiben, aber OnCreate ist wieder ein Ereignis, das zugewiesen werden muss... :)
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Do 26.11.09 17:05 
user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconMatclou hat folgendes geschrieben Zum zitierten Posting springen:
Wo müsste das zuweisen denn passieren? Auch unter Type`?

Das zuweisen würde ich immer unter FormOnCreate machen.
Also einfach einmal einen Doppelclick auf eine freie Fläche Deines Fensters, dann erscheint diese Procedure.

Alle Ereignisse zur Laufzeit zuweisen? Wozu?

_________________
PROGRAMMER: A device for converting coffee into software.