Entwickler-Ecke

Sonstiges (Delphi) - Fehler liegt nicht im Programmtext, wo dann?


Matclou - Di 24.11.09 16:36
Titel: Fehler liegt nicht im Programmtext, wo dann?
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 - 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 - 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:

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:


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 - Di 24.11.09 16:54

Ich vermute, du hast folgendes selbst geschrieben:

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:


Delphi-Quelltext
1:
2:
  Self.OnActivate := FormActivate;
  BtNeueKuh.OnClick := BtNeueKuhClick;


Matclou - 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 - 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 - 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 - Di 24.11.09 20:23

[OT]Wieso heißt die Klasse Kuh, wenn sie Fische läd oO[/OT]


ffgorcky - 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 - 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 - 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?