AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Ein Panel an eine Instanz einer Klasse TBall übergeben
Thema durchsuchen
Ansicht
Themen-Optionen

Ein Panel an eine Instanz einer Klasse TBall übergeben

Ein Thema von Smiley · begonnen am 9. Mär 2022 · letzter Beitrag vom 11. Mär 2022
Antwort Antwort
venice2
(Gast)

n/a Beiträge
 
#1

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

  Alt 10. Mär 2022, 15:42
Zitat:
@Venice2
Dein Strandball ist toll, aber zu kompliziert für ein Tutorial, wegen der vielen Windows und OpenGL Aufrufe.
Na dann.. kein OpenGL

Geändert von venice2 (11. Mär 2022 um 11:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
210 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 10. Mär 2022, 16:20
@Venice2
Sehr schön gemacht, sieht auch gut aus ohne das OpenGL.
Du hast hier SKAERO verwendet, ist das etwas zusätzliches, konnte auf die schnelle nichts dazu finden.
Viel WindowsCode(Fensterverwaltung mit drin) und einiges das aussieht als sei es zu einer Zeit geschrieben als Delphi noch nicht so viel mit drin hatte (StrUtils gibts mittlerweile für MidStr,LeftStr usw., hatte ich mir früher auch mal selbst gebastelt aus dem Copy Befehl).
Globals.pas ist scheinbar eine alte Zusammenstellung von Befehlen, um es mit einigen Befehlen leichter zu haben. (Einiges gibt es jetzt schon in Delphi).

Die Sprite Technik ist was für mich, das scheint etwas einfacher zu sein als OpenGL.

Danke für den Code, da kann ich noch einiges draus lernen.
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#3

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

  Alt 10. Mär 2022, 17:01
@Venice2
Sehr schön gemacht, sieht auch gut aus ohne das OpenGL.
Du hast hier SKAERO verwendet, ist das etwas zusätzliches, konnte auf die schnelle nichts dazu finden.
Viel WindowsCode(Fensterverwaltung mit drin) und einiges das aussieht als sei es zu einer Zeit geschrieben als Delphi noch nicht so viel mit drin hatte (StrUtils gibts mittlerweile für MidStr,LeftStr usw., hatte ich mir früher auch mal selbst gebastelt aus dem Copy Befehl).
Globals.pas ist scheinbar eine alte Zusammenstellung von Befehlen, um es mit einigen Befehlen leichter zu haben. (Einiges gibt es jetzt schon in Delphi).

Die Sprite Technik ist was für mich, das scheint etwas einfacher zu sein als OpenGL.

Danke für den Code, da kann ich noch einiges draus lernen.
Es geht hier eben darum keine VCL zu verwenden und einige Funktionen bzw. Units auszusparen das ist der ganze Trick!
SKAERO ist eine von mit erstellte Engine mit der man unabhängig von der VCL ist. Inclusive Skin Support und Verwendungen von Sprites.
Diese kann man mit der Maus selektieren und verschieben solange wie sie bei der Erstellung nicht gesperrt werden.
Der Cursor ändert sich dann zum Kreuz.

Hier ein Update damit kannst du anschließend den Ball (Sprite(0..3)) zur Laufzeit auf eine andere Position verschieben.
Auch der Lauftext ist ein Sprite und kann verschoben werden.

Einfach diese Funktion ersetzen.
Delphi-Quellcode:
{$REGION 'DrawBounce'}
procedure DrawBounce;
var
  K: Integer;
  x, y: Integer;
  s: PSpriteData;
  rc: TRect;
begin

  if bAnimate then
  begin
    GetClientRect(HSprCtrl, rc);

    for K := 3 downto 0 do
    begin
      // wenn der linke Button gedrückt wird und die Maus sich auf einem Sprite (Ball(0..3))
      // befindet kann man ihn verschieben von dieser Position aus bewegt er sich dann weiter.
      if not gSprCtrl.GI_IsLButtonDown then
      begin
        s := @gSpriteData[k];
        if s.xDir > 0 then
        begin
          if s.xPos + s.nWidth > rc.Right then
            s.xDir := -s.xDir;
        end else
        if s.xPos < 0 then
          s.xDir := -s.xDir;

        if s.yDir > 0 then
        begin
          if s.yPos + s.nHeight > rc.Bottom then
            s.yDir := -s.yDir;
        end else
        if s.yPos < 0 then
          s.yDir := -s.yDir;

        s.xPos := s.xPos + s.xDir;
        s.yPos := s.yPos + s.yDir;
        gSprCtrl.GD_SetObjectXY(s.ID, s.xPos, s.yPos);
      end else
      begin
        s := @gSpriteData[k];
        // x, y Position vom aktuell selektierten Sprite
        // abhängig von der dazu gehörigen ID einlesen.
        gSprCtrl.GD_GetObjectXY(s.ID, x, y);
        s.xPos := x;
        s.yPos := y;
        // neue Position setzen
        gSprCtrl.GD_SetObjectXY(s.ID, s.xPos, s.yPos);
      end;
    end;

    if UseMarquee then
    begin
      gSprCtrl.GD_GetObjectXY(ID_OBJECT_MARQUEE, x, y);

      x := x - 2;
      if x < -MarqueeWidth then
        x := rc.Right + MarqueeWidth;
      gSprCtrl.GD_SetObjectXY(ID_OBJECT_MARQUEE, x, y);
    end;

    gSprCtrl.GI_UpdateWindow(HSprCtrl, false);
  end;
end;
{$ENDREGION}
uControls..
Delphi-Quellcode:
  for K := 0 to ID_MAX_SPRITE - 1 do
  begin
    gSpriteData[K].hBmp := gSprCtrl.GI_CreateBitmapFromFile(PWideChar(gSpriteData[K].ImageName), ImgW, ImgH);
    gSpriteData[K].ID := ID_OBJECT_SPRITE + K;
    gSpriteData[K].nWidth := ImgW;
    gSpriteData[K].nHeight := ImgH;
    gSpriteData[K].xPos := random(400);
    gSpriteData[K].yPos := random(300);

    gSprCtrl.GD_DrawBitmapToCtrl(HSprCtrl, gSpriteData[K].xPos, gSpriteData[K].yPos, gSpriteData[K].hBmp, $FFFFFFFF,
      gSpriteData[K].ID, GS_VISIBLE);
    // Werden die Sprites gesperrt lassen sie sich nicht mehr verschieben.
    gSprCtrl.GD_SetObjectLocked(gSpriteData[K].ID, true);
  end;

Geändert von venice2 (10. Mär 2022 um 17:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
210 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 11. Mär 2022, 11:30
@Venice2
Danke für Deine Hilfe Venice2

Das mit den $Region´s kannte ich noch gar nicht.
Tolles Feature um den Quelltext lesbarer (zusammmenklappbar über mehrere Proceduren) zu machen.


Die procedure InitPath verwirrt mich etwas. Die beiden If/else Zweige führen den gleichen Befehl aus, habe ich da etwas übersehen ?
Möglicherweise ein Überbleibsel aus einer Zeit als TiniFile.Create noch nicht automatisch die Ini-Datei angelegt hat?
Code:
procedure InitPath;
begin
  UserAppDataDir := GetSpecialFolder(CSIDL_APPDATA);
  if FileExists(UserAppDataDir +  '\BrewIdeas\Bounce' + '\Bounce.ini') then
    BounceIni := TIniFile.Create(UserAppDataDir + '\BrewIdeas\Bounce' + '\Bounce.ini')
  else
    BounceIni := TIniFile.Create(UserAppDataDir + '\BrewIdeas\Bounce' + '\Bounce.ini');
end;
Hast Du irgend eine Art von Dokumentation zu den wichtigsten Befehle der SKAeroAPI.
Der SourceCode ist schon gut Dokumentiert.
Sonst schreib ich mir dazu etwas um leichter die API verwenden und erklären zu können.
Das verwende ich dann für die Stufe 2 des Ball Projektes für meine Praktikanten.

Das Projekt lässt sich nicht compilieren, da er die Unit Graphics nicht findet, da du da scheinbar deine eigene Graphics.pas benutzt hast um die VCL zu umgehen, nehme ich an.
Was muss dafür noch eingestellt werden im Compiler?
Ist die SKAeroAPI überhaupt dabei? Habe im .pas File eigentlich nur Procedure-Definitionen gesehen, braucht man da noch eine .dcu dazu, die nicht mitgeliefert ist?
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#5

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

  Alt 11. Mär 2022, 11:48
Zitat:
Die beiden If/else Zweige führen den gleichen Befehl aus, habe ich da etwas übersehen ?

Die if Anweisung kannst du eigentlich entfernen ist nicht nötig.

Zitat:
Das Projekt lässt sich nicht compilieren, da er die Unit Graphics nicht findet
Meine Projekte soweit diese nicht 64Bit sind kompiliere ich mit D2010.

Neuere Delphi Versionen benötigen diesen Aufruf.
VCL.Graphics (Ja hier verwende ich noch die VCL aber nicht für einfach Funktionen aus der StrUtils.pas, Forms etc..)

Zitat:
Hast Du irgend eine Art von Dokumentation zu den wichtigsten Befehle der SKAeroAPI.
Nein. Ich habe die Funktionen Prozeduren so Namentlich angepaßt das diese eigentlich selbsterklärend sind.

Zitat:
Ist die SKAeroAPI überhaupt dabei? Habe im .pas File eigentlich nur Procedure-Definitionen gesehen, braucht man da noch eine .dcu dazu, die nicht mitgeliefert ist?
Ja im Ordner _api eine *.dcu wird nicht benötigt diese wird beim kompilieren erstellt.

In uControls kannst du sehen wie bspw. ein Button erstellt wird.
Im Grunde ist das vorgehen immer gleich.

Geändert von venice2 (11. Mär 2022 um 11:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
210 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 11. Mär 2022, 12:06
Wow, superschnelle Antwort und sehr ausführlich mit Frage/Antwort.
Du machst das richtig gut.

VCL.Graphics dachte ich hätte ich als erstes probiert, nun jetzt hat es funktioniert.

Er meldet nur noch, dass ihm die SK_Aero.dll fehlt.
Habe die Bin Dateien mit in das Projektverzeichnis reingenommen, geht trotzdem nicht.
Es wird keine .dll erzeugt.
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#7

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

  Alt 11. Mär 2022, 12:15
Zitat:
SK_Aero.dll
war doch im Archiv vorhanden oder nicht?

Ich schicke dir einen link (PN) zu allen meinen Projekten (samples) such dir aus was du brauchst.
Eigentlich wird in diesen fast alle Funktionen meiner DLL irgendwo behandelt.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:14 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