![]() |
[Andorra 2] Problem beim Freigeben des GUI-Editors
Hi Leuts,
ich stehe vor einem Problem: Und zwar schaffe ich es nicht das GUI anzuzeigen und wenn die Instanz dann am Ende freigegeben werden soll, kommt im Intervall meines Timers ein Fehlermeldung mit nem Nilpointer. Mein Code sieht wiefolgt aus:
Delphi-Quellcode:
Ist halt eigentlich nur ein schwarzer Bildschirm mit der GUI drauf, die nur aus einem Button besteht.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Addraws, AdClasses, AdTypes, ExtCtrls, StdCtrls, AdComponents, AdGUIConnector, AdGUI; type TForm1 = class(TForm) Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); procedure Timer1Timer(Sender: TObject); private public AdDraw : TAdDraw; AdGUI : TAdGUI; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin AdDraw := TAdDraw.Create(self); AdDraw.DllName := 'AndorraDX93D.dll'; AdDraw.Options := AdDraw.Options + [DoFullscreen]; AdDraw.Display.Width := 800; Addraw.Display.Height := 600; AdDraw.Display.BitCount := 32; if not AdDraw.Initialize then begin ShowMessage('Andorra 2D konnte nicht gestartet werden.'); halt; end; AdGUI := TAdGUI.Create(AdDraw); AdGUI.Skin.LoadFromFile('sunna.axs'); AdGUI.Cursors.LoadFromFile('Cursors.xml'); AdGUI.LoadFromFile('Test.axg'); ShowMessage('Es wurde alles initialisiert!'); Timer1.Enabled := True; end; procedure TForm1.FormDestroy(Sender: TObject); begin AdDraw.Free; AdGui.Free; //lässt man diese Zeile weg, kommen keine Fehlermeldungen end; procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin if (key=#27) then halt; end; procedure TForm1.Timer1Timer(Sender: TObject); begin AdDraw.ClearSurface(clblack); AdDraw.Flip; end; end. Hoffe ihr könnt mir helfen, ich habe die Vermutung, dass bei mir diese Bedingung nicht erfüllt ist Zitat:
habe ich dabei was falsch gemacht? mfg Looper |
Re: [Andorra 2] Problem beim Freigeben des GUI-Editors
Hallo,
In der neuen Version (0.3.5) wird die JVCL/JCL gar nicht mehr benötigt (habe ich vergessen zu sagen). Bei einer älteren Version würde es ohne JCL nicht kompilieren. Ich sehe folgende Fehler in deinem Code: 1. Die GUI wird nach dem AdDraw freigegeben. Dies führt zu der Zugriffsverletzung. Das GUI-System beinhaltet Klassen, die auf das AdDraw zugreifen und von diesem Elemente reservieren. Beim Freigeben möchten Sie diese natürlich dem AdDraw zurückgeben. Doch leider existiert dieses nicht mehr. Du solltest Elemente immer in umgekehrter Erstellungsreihenfolge freigeben. 2. Dein Timer-Code ist unvollständig. Vier Anweisungen sind auf jeden Fall von Nöten:
Delphi-Quellcode:
Wenn du noch Fragen hast melde dich,
AdDraw.ClearSurface(0); //Löscht das Surface
AdDraw.BeginScene; //Beginnt eine neue Szene //Hier muss dein Code hin: AdGUI.Update(AdPerformanceCounter.TimeGap / 1000); AdDraw.EndScene; //Beendet die Szene - hiernach kann nichts mehr gezeichnet werden. AdDraw.Flip; //Aktualisiert die Anzeige Andreas |
Re: [Andorra 2] Problem beim Freigeben des GUI-Editors
Schonmal danke für die schnelle Antwort. Ich habe den Quelltext jetzt so geändert. Die Fehlermeldung kommt beim Beenden nicht mehr. Allerdings wird die GUI immernoch nicht angezeigt.
Delphi-Quellcode:
Die Gui sieht wiefolgt aus:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Addraws, AdClasses, AdTypes, ExtCtrls, StdCtrls, AdComponents, AdGUIConnector, AdGUI, AdPerformanceCounter; type TForm1 = class(TForm) Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); procedure Timer1Timer(Sender: TObject); private public AdDraw : TAdDraw; AdGUI : TAdGUI; AdPerformanceCounter : TAdPerformanceCounter; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin AdDraw := TAdDraw.Create(self); AdDraw.DllName := 'AndorraDX93D.dll'; AdDraw.Options := AdDraw.Options + [DoFullscreen]; AdDraw.Display.Width := 800; Addraw.Display.Height := 600; AdDraw.Display.BitCount := 32; if not AdDraw.Initialize then begin ShowMessage('Andorra 2D konnte nicht gestartet werden.'); halt; end; AdGUI := TAdGUI.Create(AdDraw); AdGUI.Skin.LoadFromFile('sunna.axs'); AdGUI.Cursors.LoadFromFile('Cursors.xml'); AdGUI.LoadFromFile('Test.axg'); AdPerformanceCounter := TAdPerformanceCounter.Create; Timer1.Enabled := True; end; procedure TForm1.FormDestroy(Sender: TObject); begin AdPerformanceCounter.Free; AdGUI.Free; AdDraw.Free; end; procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin if (key=#27) then halt; end; procedure TForm1.Timer1Timer(Sender: TObject); begin AdPerformanceCounter.Calculate; AdDraw.ClearSurface(clblack); AdDraw.BeginScene; AdGUI.Update(AdPerformanceCounter.TimeGap/1000); AdDraw.EndScene; AdDraw.Flip; end; end.
Delphi-Quellcode:
Irgendwas muss ich ja immernoch falsch machen?
<?xml version="1.0" encoding="iso-8859-1"?>
<TAdGUI name="AdGUI1" alpha="255" cursor="default" enabled="-1" height="51" width="352" hint="" showhint="0" visible="-1" x="0" y="0" fontcolor="0" fontname="" fontdata="00000000"> <TAdButton name="AdButton1" alpha="255" cursor="default" enabled="-1" height="25" width="125" hint="" showhint="0" visible="-1" x="8" y="3" fontcolor="0" fontname="" caption="Holz"/> </TAdGUI> |
Re: [Andorra 2] Problem beim Freigeben des GUI-Editors
Ich sehe jetzt direkt keinen Fehler mehr - bist du dir sicher, das die Zeichenroutine aufgerufen wird? Hast du einen PNG-Loader eingebunden? Dabei stehen zur Auswahl:
-AdPNG.pas --> Benötigt die Bibliothek "PNGDelphi" -AdDevIL.pas --> Benötigt die DevIL Header im Suchpfad sowie die DLL "DevIL.dll" im Programmverzeichnis -AdFreeImage.pas --> Benötigt die FreeImage Header im Suchpfad sowie die DLL "FreeImage.dll" im Programmverzeichnis |
Re: [Andorra 2] Problem beim Freigeben des GUI-Editors
Also der gesamte Code ist der, der da oben zu sehen ist. Es soll lediglich ein schwarzer Bildschirm und die GUI (ein Button) erscheinen.
Um die Unit AdPNG.pas einzubinden brauche ich die ja nur unter uses hinzufügen. Und wo soll ich dann die Zeichenroutine aufrufen? mfg Looper PS: Ich finde es richtig toll wie aktiv du hier bist und zur Seite stehst sobald Probs auftreten :hello: //Aha, man muss also nur die AdPNG.pas einbinden. Jetzt wird die GUI angezeigt. Bei weiteren Probs (die es bestimmt wieder geben wird^^, melde ich mich wieder) Thema kann geschlossen werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 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 by Thomas Breitkreuz