Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [Andorra 2] Problem beim Freigeben des GUI-Editors (https://www.delphipraxis.net/109798-%5Bandorra-2%5D-problem-beim-freigeben-des-gui-editors.html)

Looper 7. Mär 2008 18:56


[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:
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.
Ist halt eigentlich nur ein schwarzer Bildschirm mit der GUI drauf, die nur aus einem Button besteht.
Hoffe ihr könnt mir helfen, ich habe die Vermutung, dass bei mir diese Bedingung nicht erfüllt ist
Zitat:

Beachten Sie, dass Sie zum kompilieren eines Programms mit Andorra 2D GUI die Komponentensammlung "JVCL" installiert haben müssen, bzw. die benötigte Bibliothek "JvSimpleXML" und alle dazugehörigen Dateien im Suchpfad von Delphi eingetragen sind (unter Delphi in Tools->Optionen->Bibliothek - Win32).
Da ich nicht genau weiß wie das geht, habe ich einfach das JVCL-Projekt komplett gedownloadet und zu den Suchpfad und Bibliothekssuchpfad von Delphi hinzugefügt.
habe ich dabei was falsch gemacht?

mfg Looper

igel457 7. Mär 2008 19:08

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:
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
Wenn du noch Fragen hast melde dich,
Andreas

Looper 7. Mär 2008 19:41

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:
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.
Die Gui sieht wiefolgt aus:
Delphi-Quellcode:
<?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>
Irgendwas muss ich ja immernoch falsch machen?

igel457 7. Mär 2008 20:03

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

Looper 7. Mär 2008 20:16

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 09:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz