Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Mysteriöser Fehler (https://www.delphipraxis.net/2012-mysterioeser-fehler.html)

nailor 2. Jan 2003 21:43


Mysteriöser Fehler
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  Bild: TBitMap;
const
  Pfade: array[0..2] of string = ('1.bmp', '2.bmp', '3.bmp');
begin
Bild := TBitMap.Create;      //Hier ist Zeile 283
for i := 0 to 2 do
  begin
    Bild.LoadFromFile(Pfade[i]);
    Imagelist1.AddMasked(Bild, clNone);
  end;
Bild.Free;
end;
In einem neuen Projekt geht das wunderbar. In meiner Anwendung allerdings nicht. :kotz: Delphi meldet

[Error] Unit1.pas(283): Object or class type required

Die Variablen sind nicht andersweitig deklaruert, die units sind eingebunden. Bin ich blöd? :wiejetzt:

Daniel B 2. Jan 2003 22:20

Moin,

also bei mir geht die Prozedur wunderbar. Keine Compiler Meldung, keine zur Runtime...

Grüsse, Daniel :hi:

Hansa 2. Jan 2003 22:36

Hi Nailor,

Zitat:

//Hier ist Zeile 283
Wenn das bei Daniel B geht ? Was passiert denn bei Dir bis Zeile 283 :?:

Gruß
Hansa

nailor 2. Jan 2003 22:50

Wenn ich eine neue Anwendung starte, einen Button und eine Listbox reinpack, dann geht das auch ohne Fehler. Wenn ich dann aber haargenau den gleichen Code in eine Anwendung von mir übernehmen will, dann passiert genau der komische Fehler von wegen
"Object or class type required ".

Dann hab ich vermutet, dass vielleicht eine der Variablen falsch inizialisiert wird oder andersweitig vergeben ist. Ersteres kann ja nicht sein, weil egal wäre, was drinstände, zweiteres hab ich überprüft und ist nicht der Fall.
Neustart hilft nicht!

Brüggendiek 2. Jan 2003 22:53

Hallo!

Der Compilerfehler deutet auf eine fehlende bzw. fehlerhafte Deklaration hin. Kann es sein, daß Du die Unit "Graphics" nicht in Deinem Programm eingebunden hast oder in einer Unit die tBitMap überschreibt?

Wenn Graphics drin ist: Versuch macht kluck, also schreibe mal
Delphi-Quellcode:
Bild := Graphics.TBitMap.Create;
Wenn es dann klappt, hast Du in irgendeiner Unit eine neue tBitMap definiert und die wird dann genommen!

Gruß

Dietmar Brüggendiek

nailor 2. Jan 2003 22:55

Ich hab zwar keine Units eingebunden (manuell), und auch andersweitig nicht umdeklariert. Ich werde es mal testen. Meinst du dass irgendwie die graphics-unit schaden genommen hat (zb. von scandisc gefleddert?)

Daniel B 2. Jan 2003 22:57

Moin,

ich habe nur die Prozedur genommen, dann Ctrl+F zum komplizieren, dabei ist kein Fehler aufgetreten. Die Unit Grphics wird ja automatisch eingebunden, wenn diese in Deiner anderen Anwendung noch nicht vorhanden ist, dann wirds an dem liegen, wobei ich es mir nicht ganz vorstellen kann, denn Delphi bindet die beim komplizieren immer automatisch ein. Das gleiche gilt auch für die Unit ImgList.

Grüsse, Daniel :hi:

nailor 2. Jan 2003 23:00

graphics.tbitmap.create --->
[Error] Unit1.pas(283): Incompatible types: 'tagBITMAP' and 'TBitmap'

tbitmap.create --->
[Error] Unit1.pas(283): Object or class type required

Brüggendiek 2. Jan 2003 23:00

Hallo!

Zitat:

Zitat von Nailor
Meinst du dass irgendwie die graphics-unit schaden genommen hat (zb. von scandisc gefleddert?)

Wenn das passiert wäre, könntest Du keine Programme mit diese Unit mehr compilieren! Ist also mehr als unwahrscheinlich!

Gruß

Dietmar Brüggendiek

Hansa 2. Jan 2003 23:01

Hi,

Zitat:

wenn diese in Deiner anderen Anwendung noch nicht vorhanden ist,
Und wenn doch ? Bennene alles um und teste. :!:

Gruß
Hansa

nailor 2. Jan 2003 23:06

Es sind 292 Zeilen. Da ist kein anders i, kein Bild, kein TBitmap. NIX!

Brüggendiek 2. Jan 2003 23:11

Hallo!

Hurra - Lösung! :firejump:

Ich hab's mal in meinem laufenden Projekt auf dem 2. Rechner reingehauen und bekam auch die Fehlermeldungen wie bei Dir!

Mit der Deklaration
Delphi-Quellcode:
Bild: Graphics.TBitMap;
funktionierte es dann!

Offensichtlich enthält irgendeine Unit, die eingebunden wird, etwas, worüber der Compiler stolpert. Mit o.a. Code zwingst Du ihn, die Deklaration aus Graphics zu nehmen und nicht die ihm aus der Uses-Folge nächstgelegene. Zumindest bei mir lies sich das Prob damit lösen!

Gruß

Dietmar Brüggendiek

Hansa 2. Jan 2003 23:11

Hi,

trotzdem sieht das da mir nach einem Problem mit globalen / lokalen Variablen hin. Das kann sehr knifflig werden. :angle2:

Gruß
Hansa

nailor 2. Jan 2003 23:15

thx a lot!!! :D

Aber ich bin mir !!!ganz!!! sicher an meinem Delphi nichts verändert zu haben.
Hast du auch rausgefunden, wann man graphics braucht (wie bei dem Prob) und wann nicht (neue Anwendung)?

Hansa 2. Jan 2003 23:31

Hi,

Zitat:

Zitat von Hansa
trotzdem sieht das da mir nach einem Problem mit globalen / lokalen Variablen hin. Das kann sehr knifflig werden. :angle2:

Wenns das war, benenne trotzdem die Variablen um ! Wenn Du 5 Units mit Variablen gleichen Namens hast und mußt sie noch über den Unit-Namen ansprechen, na dann gute Nacht.

Gruß
Hansa

nailor 2. Jan 2003 23:35

Ich habe eine Unit mit ca. 5 Variablen. So blöd bin ich doch auch nicht, dass ich da eine doppelt nehme.

Und als ob Brüggendiek den gleichen Mist bauen würde. Soviel Zufall ist eher unwarscheinlich!

sakura 2. Jan 2003 23:36

Zitat:

Zitat von Brüggendiek
Wenn es dann klappt, hast Du in irgendeiner Unit eine neue tBitMap definiert und die wird dann genommen!

Nicht irgendeine Unit. Das ist ein Standard Problem. tagBitmap und TBitmap sind durch Windows definierte Konstrukte. In der Uses Klausel steht die Unit Graphics vor der Unit Windows. Daraus ergibt sich dieses Problem. Auszug aus Windows.pas
Delphi-Quellcode:
{ Bitmap Header Definition }
  PBitmap = ^TBitmap;
  {$EXTERNALSYM tagBITMAP}
  tagBITMAP = packed record
    bmType: Longint;
    bmWidth: Longint;
    bmHeight: Longint;
    bmWidthBytes: Longint;
    bmPlanes: Word;
    bmBitsPixel: Word;
    bmBits: Pointer;
  end;
  TBitmap = tagBITMAP;
  {$EXTERNALSYM BITMAP}
  BITMAP = tagBITMAP;

nailor 2. Jan 2003 23:42

Ich glaubs nicht! Ich hab die Klauseln vertauscht und es läuft ohne graphics.blabla

Wo käm man nur ohne so ein Forum hin? Da kommt doch kein normaler Mensch von allein drauf!

sakura 2. Jan 2003 23:43

Zitat:

Zitat von Nailor
Da kommt doch kein normaler Mensch von allein drauf!

Doch. Aber auch nur mit Hilfe der Options "Find Deklaration" vom Kontext-Menü.

nailor 2. Jan 2003 23:49

Damit hast du dich stillschweigend als normalen Menschen durchmogeln wollen! :wink:

Hansa 2. Jan 2003 23:52

Hi,

Zitat:

Zitat von Nailor
Da kommt doch kein normaler Mensch von allein drauf!

Stimmt! Wenn das vom Betriebssytem kommt, was willst Du da machen ? Da kannst Du wochenlang Fehler suchen. :evil: Im eigenen Programm kannst Du mit sowas nur Abstürze provozieren.

Gruß
Hansa


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:35 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