Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Ein Panel an eine Instanz einer Klasse TBall übergeben (https://www.delphipraxis.net/210154-ein-panel-eine-instanz-einer-klasse-tball-uebergeben.html)

venice2 11. Mär 2022 13:23

AW: Ein Panel an eine Instanz einer Klasse TBall übergeben
 
Zitat:

Zitat von Smiley (Beitrag 1503178)
Hier mein Project

Wenn du den Pfad zur Konfigurationsdatei inklusive der Ressourcen Ordner falsch angibst wird das nix.
Der Pfad in dem die Exe kompiliert wird ist ..\bin dort müssen die Ordner Skin und SpriteRes enthalten sein inklusive der SK_Aero.dll.

Ist das nicht der fall wird ein exception geworfen beim Debuggen und zwar
raise Exception.Create('Skin Config invalid or not available!');


weil die Konfiguration nicht gefunden wird.
Schau doch einfach mal worauf dieser Pfad zeigt.
Delphi-Quellcode:
      DefSkin := BounceIni.ReadString('SkinPath', 'Skin', ExtractFilePath(ParamStr(0))
          + 'Skins\Blue\Bounce.ske');
EDIT:
Machen wir es einfacher.

lösche das in der uIni!
WriteString('SkinPath', 'Skin', WideString(ExtractFileDir(SKAERO_CONFIG_GetSkinFol der)
+ '\Bounce.ske'));

ändere das in uMain
Delphi-Quellcode:
      InitPath;
      DefSkin := BounceIni.ReadString('SkinPath', 'Skin', ExtractFilePath(ParamStr(0))
          + 'Skins\Blue\Bounce.ske');
      BounceIni.Free;
zu
Delphi-Quellcode:
 
DefSkin := ExtractFileDir(ParamStr(0)) + '\Skins\Blue\Bounce.ske';
lösche
Zitat:

'C:\Users\BrewIdeas\AppData\Roaming\BrewIdeas\Boun ce\Bounce.ini'
und gut ist...

Das Problem ist wenn man den Pfad zur Konfigurationsdatei in der INI speichert und du das Projekt nach dem ersten Start
anschließend von einem anderen Pfad ausführst und der alte Pfad zur Ini (siehe erster Start) nicht mehr existiert wirft die Anwendung ein Exception.
Deshalb habe ich die Speicherung des Pfad jetzt mit diesen Änderungen aus der INI herausgenommen.

Smiley 11. Mär 2022 14:18

AW: Ein Panel an eine Instanz einer Klasse TBall übergeben
 
Habe den Fehler jetzt gefunden.
Der DefSkin Path war schon richtig, denn der Skins Ordner liegt im gleichen Ordner wie die .exe Datei.
Das Problem ist der Eintrag in der .ini Datei für den SkinPath.
Dieser wird nur beim ersten Aufruf des Programmes einmal gesetzt und liest ihn dann immer wieder, auch wenn die .exe jetz an einem anderen Ort liegt.
Dort war noch der Pfad aus der entpackten .rar Datei im Temp Verzeichnis drin, da ich beim ersten Versuch direkt aus der .rar Datei die .exe aufgerufen haben.
Nachdem ich die .rar datei geschlossen hatte, wurden dann auch die Dateien dort gelöscht und er konnte nichts mehr finden.

Man könnte das vermeiden, indem man, falls die Datei nicht gefunden wird, nochmal unter dem Pfad der .exe sucht.

Mich stört es, wenn mein Programm noch ein Verzeichnis davor braucht um die .exe zu speichern, daher lege ich die .exe entweder in das Projektverzeichnis oder wenn zur Exe noch andere Dateien gehören, dann lege ich die unter Projekt\_bin damit alles in einem Verzeichnis bleibt.
Das kann aber jeder für sich anders machen.

Das Problem hier war eigentlich nur, dass man die .exe Datei mit ihren Ordnern nicht verschieben darf, wenn es einmal gestartet wurde, da es den Pfad immer aus der .ini Datei liest und nicht mehr neu prüft. Dann brauche ich immer eine Setup Routine zum installieren des Programmes, die die .ini Datei dann neu anlegt.

Vielen Dank Venice2 dass Du Dir so viel Mühe mit mir gibst und mir weiterhilfst wenns mal nicht klappt.
Danke Danke Danke!!!

venice2 11. Mär 2022 14:53

AW: Ein Panel an eine Instanz einer Klasse TBall übergeben
 
Zitat:

Das Problem ist der Eintrag in der .ini Datei für den SkinPath.
Jo schrieb ich ja und wie man es ändern kann auch :)
Zitat:

Das Problem ist wenn man den Pfad zur Konfigurationsdatei in der INI speichert und du das Projekt nach dem ersten Start
anschließend von einem anderen Pfad ausführst und der alte Pfad zur Ini (siehe erster Start) nicht mehr existiert wirft die Anwendung ein Exception.
Deshalb habe ich die Speicherung des Pfad jetzt mit diesen Änderungen aus der INI herausgenommen.
Zitat:

Mich stört es, wenn mein Programm noch ein Verzeichnis davor braucht um die .exe zu speichern, daher lege ich die .exe entweder in das Projektverzeichnis oder wenn zur Exe noch andere Dateien gehören, dann lege ich die unter Projekt\_bin damit alles in einem Verzeichnis bleibt.
Das kann aber jeder für sich anders machen.
Richtig!
Zitat:

Vielen Dank Venice2 dass Du Dir so viel Mühe mit mir gibst und mir weiterhilfst wenns mal nicht klappt.
Danke Danke Danke!!!
Kein Problem. ;)
Wenn was ist melde dich einfach.

Smiley 11. Mär 2022 15:44

AW: Ein Panel an eine Instanz einer Klasse TBall übergeben
 
Ja mach ich.
Unsere Meldungen haben sich überschnitten, war noch am suchen und schreiben, da hast Du schon geantwortet, das habe ich erst gesehen, nachdem ich es abgeschickt habe.
Änderung ist schon eingebaut.

Jetzt muss ich mich aber wieder mal meinem eigentlichen, kleinerem Problem zuwenden, wie ich mein einfaches Lernprojekt fortsetze.
Zu Anfang dachte ich es sei leichter mit einem TPanel und einem TShape darauf zu arbeiten, da man dafür die x und y Koordinaten für den linken oberen Punkt übergeben muss und sich nicht wie bei einem gezeichneten Kreis noch mit Mittelpunkt vom Kreis und linkem Rand vom Kreis beschäftigen muss.
Das geht aber auch wenn ich ein Rechteck zeichne und später den Kreis.
Außerdem kann man auch mit einem Image arbeiten und das bewegen.

Jetzt habe ich mich erst mal für eine Painbox entschieden auf die ich dann ein Rechteck zeichne.
Die Randprüfung überfordert die meisten Anfänger schon.

Ich nehme also eine Form und setze eine Paintbox darauf.
Mit Ball := TBall.Create(Paintboxname); erstelle ich dann einen Ball in der MainForm.
im TBall Objekt übernehme ich diese PB dann mit
in der Typ Deklaration und rufe es auf mit
Code:
constructor Create (AOwner: TPaintbox);
und in der Implementierung mit
Code:
constructor Tball.Create (AOwner: TPaintbox);
Hier initialisere ich meine Variable und erstelle meinen Timer für den Ball.
Code:
Inherited;
BallTimer := TTimer.Create(nil);
BallTimer.OnTimer := OnBallTimer;
Im OnBallTimer Ereignis kann ich dann den Ball, mit berechneten Koordinaten, auf dem canvas der übergebenen Paintbox, zeichnen.

Das funktioniert schon mal.

Was ist mit dem override beim Constuctor ? Brauche ich das ?

Kann ich in der MainForm auch ein Image verwenden und TBall erkennt das anhand der übergebenen Componente ?

venice2 11. Mär 2022 16:00

AW: Ein Panel an eine Instanz einer Klasse TBall übergeben
 
Wenn BallTimer innerhalb der class TForm definiert ist dann kannst du meines Erachtens es auch so erstellen.
Delphi-Quellcode:
BallTimer := TTimer.Create(self);
Zitat:

Kann ich in der MainForm auch ein Image verwenden und TBall erkennt das anhand der übergebenen Componente ?
Gehe ich mal von aus. Obwohl ich nicht so viel mit VCL.Forms zu tun habe.
Einfach mal versuchen. ;)

Smiley 11. Mär 2022 16:13

AW: Ein Panel an eine Instanz einer Klasse TBall übergeben
 
Nein der Timer liegt nicht im MainForm, das den Ball aufruft.
MainForm legt eine Instanz von BallA an und der Ball soll auf der Paintbox oder dem Image von MainForm laufen.
Der Timer wird in TBall erstellt.
MainForm kann eine weitere Ball-Instanz erstellen und zusätzlich auf der Paintbox oder auch einem anden Control laufen lassen.
Der zweite Ball kann mit BallB.Speed z.B. auch eine andere Geschwindigkeit haben und eine andere Größe (BallB.Size).


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:54 Uhr.
Seite 3 von 3     123   

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