Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi break it problem (https://www.delphipraxis.net/147030-break-problem.html)

speedy23 31. Jan 2010 15:50


break it problem
 
ich habe diesen quelltext gefunden, der ist für pong... ich mache ein breakit aber ich habe das problem, dass ich den ball nicht im image halten kann. er fliegt einfach immer weiter... .



Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var x,y:integer;

begin
  x := 5;
  y := 5;
  Shape1.Left := Shape1.Left +x ;
  Shape1.Top := Shape1.Top + y;

 
  if (Shape1.Top <= 100) or (Shape1.Top >= image1.ClientHeight) then
  begin
    y := -y;
  end;

 
  if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth) then
  begin
    x := -x;
  end;

end;

end.


müsste das nicht eigentlich durch image1.client... ausgeschlossen werden??

mfg

[edit=Matze][delphi]-Tags eingefügt. Zukünftig bitte selbst daran denken. MfG, Matze[/edit]

mkinzler 31. Jan 2010 15:57

Re: break it problem
 
Da x und y lokale Variabeln sind, interessiert es etwaige (durch die lokalen überdeckte) globale Variablen des selben Namens nicht die Bohne, was du dort zuweist
@Matze, warum hast du meinen Edit wegeditiert?

speedy23 31. Jan 2010 16:00

Re: break it problem
 
und was sagt mir das jetzt... sorry aber ich versteh schon was das heißt aber wie wirkt sich das auf mein problem aus?

(sorry wegen dem falsch geposteten quelltext)

mkinzler 31. Jan 2010 16:01

Re: break it problem
 
Das heisst du sollst die lokalen Variablen weglassen!

speedy23 31. Jan 2010 16:06

Re: break it problem
 
wenn ich aber x und y weglasse was ändert das an der sache ich muss ja den wechsel in die negative haben wenns reflektiert wird oder? wenn i einfach nur mit den zahlen anstatt variablen arbeite... i hab gerade n denkfehler

himitsu 31. Jan 2010 16:20

Re: break it problem
 
Erstmal die Reihenfolge ändern
und die Grenzen richtig setzen.
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var x,y:integer;

begin
  x := 5;
  y := 5;
 
  if (Shape1.Top <= 100) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then
  begin
    y := -y;
  end;
  if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then
  begin
    x := -x;
  end;

  Shape1.Left := Shape1.Left + x;
  Shape1.Top := Shape1.Top + y;
end;
So, jetzt würden zumindestens die Shapes erstmal am Rand hängenbleiben, da rechtzeitig ausgewertet wird.

- Variable setzen
- diese Variable verrechnen
- jetzt erst die Begrenzung beachten und Wert änder bringt nichts mehr, da es schon verrechnet wurde :zwinker:


Ja und nun noch der nächste Schritt:

die variablem in den Private-Abschnitt der Form verschieben
Delphi-Quellcode:
var x,y:integer;
und die Starteinstellung z.B. ins OnCreate (nur einmal bei, bzw. vor dem Start setzen)
Delphi-Quellcode:
x := 5;
y := 5;

speedy23 31. Jan 2010 16:26

Re: break it problem
 
habs jetzt angepasst aber iwie bleibt das mittem auf meinem image hängen und pendelt... ich verstehs nicht...
wenn ich die x,y durch minus 5 ersetze startet er ja in entgegengesetzte richtung, aber das problem ist das er das image immernoch verlässt...



Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var x,y:integer;

begin
   x := 5;
  y := 5;

  if (Shape1.Top <= 0) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then
  begin
    y := -y;
  end;
  if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then
  begin
    x := -x;
  end;

  Shape1.Left := Shape1.Left + x;
  Shape1.Top := Shape1.Top + y;
end;
[edit=mkinzler]Code-Tag durch Delphi-Tag ersetzt. Scheint manche hier zu überfordern, die entsprechende Sprache auszuwähen! Mfg, mkinzler[/edit]

himitsu 31. Jan 2010 16:31

Re: break it problem
 
was hab ich zu dem
Delphi-Quellcode:
x := 5;
y := 5;
geschrieben?

speedy23 31. Jan 2010 16:41

Re: break it problem
 
hab ich jetzt gemacht, aber nun bewegt sich der ball gar nicht mehr :(... die var x,y:integer; habsch oben beim form unter implementation und die x:=5, ... unter onbuttonclick bei meinem startknopf

mkinzler 31. Jan 2010 16:42

Re: break it problem
 
Und wo veränderst du diese Werte?

speedy23 31. Jan 2010 16:47

Re: break it problem
 
inwiefern? na im timer oder net? solange der timer läuft wird alle 0,1 sek das shape 5 pixel verschoben oder hab ich das system nicht verstanden? (offensichtlich... :oops:)

mkinzler 31. Jan 2010 16:52

Re: break it problem
 
Dann verwende besser Konstanten
Delphi-Quellcode:
const dx=5, dy=5;

speedy23 31. Jan 2010 17:00

Re: break it problem
 
daran liegt das glaube ich leider nicht... ich zeig dir mal den kompletten code, vllt kannst du mir dann weiterhelfen, wenn du magst.



Code:

implementation
const dx=5;
      dy=5;
{$R *.dfm}
 var x,y:integer;
procedure TForm1.PauseknopfClick(Sender: TObject);
begin
  {Spiel pausieren und button pause unsichtbar --> Start sichtbar}
 pauseknopf.visible:=false;
 timer1.enabled:=false;
end;

procedure TForm1.StartknopfClick(Sender: TObject);
begin
  {macht den pauseknopf sichtbar, setzt spiel fort}
  timer1.Enabled:=true;
  pauseknopf.Visible:=True;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin

      if reflektor.left > 110 then
      begin
       case ord(key) of
        vk_left:reflektor.left:=reflektor.left-14;
       end;
      end;

      if (reflektor.left < 426) then
      begin
       case ord(key) of
         vk_right:reflektor.left:=reflektor.left+14;
       end;
      end;
   end;

procedure TForm1.Timer1Timer(Sender: TObject);
var dx,dy:integer;
begin


  if (Shape1.Top <= 0) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then
  begin
    dy := -dy;
  end;
  if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then
  begin
    dx := -dx;
  end;

  Shape1.Left := Shape1.Left + dx;
  Shape1.Top := Shape1.Top + dy;
end;





procedure TForm1.FormCreate(Sender: TObject);
begin
timer1.Enabled:=false;

end;

procedure TForm1.NeuesSpiel1Click(Sender: TObject);

begin
 timer1.enabled:=true;

end;

end.

rollstuhlfahrer 31. Jan 2010 17:10

Re: break it problem
 
HI,

um die schönen Formatierungen wie in den obrigen Posts hinzubekommen, verwende NICHT Code sondern Delphi-Tags. Die gibts übrigens in der Menüleiste unter "Oft genutzt".

so, zu deinem Problem:
  • Warum verwendest du lokale Variablen, die genauso heißen, wie deine Konstanten?
  • Wie willst du denn damit Werte ungleich 0 erreichen?
  • Mal debuggen und gucken, was dx und dy so für werte haben.

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var x,y:integer;
begin
  // x = dx;
  // y = dy;

  if (Shape1.Top <= 0) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then
  begin
    dy := -dy;
  end;
  if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then
  begin
    dx := -dx;
  end;

  Shape1.Left := Shape1.Left + dx;
  Shape1.Top := Shape1.Top + dy;
end;
Bernhard

speedy23 31. Jan 2010 17:21

Re: break it problem
 
sorry aber nur das mit den variablen habe ich verstanden... was meinst du mit dem rest? wieso muss ich ungleich null erreichen? und debuggen... habsch noch nie gemacht?

edit| tut mir leid das ich euch so auf die nerven gehe aber ich finde den fehler einfach nicht... ich versteh das so...

Delphi-Quellcode:
rocedure TForm1.Timer1Timer(Sender: TObject);
var dx,dy:integer;
begin


  if (Shape1.Top <= 0) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then //wenn oberseite
    // vom kreis=0  oder der kreis die höhe des images überschreitet , dann reflektiere            
  begin
    dy := -dy; //richtungsänderung
  end;
  if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then
  begin
    dx := -dx; // richtungsänderung
  end;

  Shape1.Left := Shape1.Left + dx; // das verrücken ohne kollision vom kreis
  Shape1.Top := Shape1.Top + dy;
end;

EWeiss 31. Jan 2010 17:24

Re: break it problem
 
Hier :)

rollstuhlfahrer 31. Jan 2010 17:28

Re: break it problem
 
nochmal: für deine Richtungsänderung kannst du keine Konstanten nehmen, da wie der Name schon sagt, Konstanten konstant sind und du denen somit keinen ANDEREN Wert als den einmal zugewiesenen geben kannst. Also brauchst du ne Variable (da die variabel ist), der du dann den Wert der Konstanten zuweist und dann die Richtungsänderung ausführst.

Bernhard

speedy23 31. Jan 2010 17:36

Re: break it problem
 
Delphi-Quellcode:
begin
  // x:=DX;
  // y:=dy;

  if (Shape1.Top <= 0) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then
  begin
    dy := -dy;
  end;
  if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then
  begin
    dx := -dx;
  end;

  Shape1.Left := Shape1.Left + dx;
  Shape1.Top := Shape1.Top + dy;
end;
ich verstehe einfach nicht was ich tun soll könntest du nicht evtl sagen was ich durch was ersetzen muss... ichv erstehe deine gedanken mit den konstanten klar die können sich dann nciht verändern
aber ich denke ich soll mit konstanten arbeiten

mkinzler 31. Jan 2010 17:41

Re: break it problem
 
Die Konstanten waren für den Wert 5 gedacht.

Delphi-Quellcode:
   x:=DX;
   y:=dy;

  if (Shape1.Top <= 0) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then
  begin
    y := -dy;
  end;
  if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then
  begin
    x := -dx;
  end;

  Shape1.Left := Shape1.Left + x;
  Shape1.Top := Shape1.Top + y;

speedy23 31. Jan 2010 17:44

Re: break it problem
 
danke für die antwort :)
leider funktinoiert es weiterhin nicht
der punkt wird kreiert und flimmert auf einer stelle ohne jegliche bewegung... was zu hölle mach ich denn falsch?

|edit
soll ich evtl den ganzen quelltext nochmal posten?

EWeiss 31. Jan 2010 18:01

Re: break it problem
 
Zitat:

Zitat von speedy23
danke für die antwort :)
leider funktinoiert es weiterhin nicht
der punkt wird kreiert und flimmert auf einer stelle ohne jegliche bewegung... was zu hölle mach ich denn falsch?

|edit
soll ich evtl den ganzen quelltext nochmal posten?

DX, DY global definieren und x, y innerhalb des Timers

Dann setze in den Zeilen einen Breakpoint

Delphi-Quellcode:
if (Shape1.Top <= 0) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then
if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then
und schau was Dx, und Dy ausgeben wenn du in diese zeile springst.

Nebenbei
Wenn man nur eine zeile hinter einer IF abfrage schreibt ist ein Begin .. End nicht nötig.

Delphi-Quellcode:
  if (Shape1.Top <= 0) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then
    y := -dy;
gruss

mkinzler 31. Jan 2010 18:04

Re: break it problem
 
Zitat:

Nebenbei
Wenn man nur eine zeile hinter einer IF abfrage schreibt ist ein Begin .. End nicht nötig.
Macht den code aber übersichtlicher und verhindert Fehler beim späteren Ergänzungen an der Stelle

EWeiss 31. Jan 2010 18:05

Re: break it problem
 
Zitat:

Zitat von mkinzler
Zitat:

Nebenbei
Wenn man nur eine zeile hinter einer IF abfrage schreibt ist ein Begin .. End nicht nötig.
Macht den code aber übersichtlicher und verhindert Fehler beim späteren Ergänzungen an der Stelle

Aber nicht nötig ;)

gruss

speedy23 31. Jan 2010 18:09

Re: break it problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
das mit dem begin end hinter den if sachen ist angewohnheit, weil ja öfters nicht nur ein befehl danach steht...so aber wie gehe ich mit einem breakpoint um das kenn ich gar nicht? delphi hilfe bringt mir da leider auch nichts... anbei das beispiel in der exe

EWeiss 31. Jan 2010 18:12

Re: break it problem
 
Zitat:

Zitat von speedy23
das mit dem begin end hinter den if sachen ist angewohnheit, weil ja öfters nicht nur ein befehl danach steht...so aber wie gehe ich mit einem breakpoint um das kenn ich gar nicht? delphi hilfe bringt mir da leider auch nichts... anbei das beispiel in der exe


jo jeder wie er will ;)

Jetzt mal im ernst was sollen die Leute hier mit einer EXE ?
Damit kann dir niemand helfen.

gruss

mkinzler 31. Jan 2010 18:13

Re: break it problem
 
Zitat:

Aber nicht nötig Wink
Zeielumbrüche auch nicht.
Man sollte aber alles tun, um den Code lesbar zu gestalten!

speedy23 31. Jan 2010 18:15

Re: break it problem
 
ja okay das mit der .exe war nur damit ihr sehr was ich meine mit dem hängenbleiben... hier der code

Delphi-Quellcode:

var
  Form1: TForm1;

implementation
const dx=5;
      dy=5;
{$R *.dfm}
 var x,y:integer;
procedure TForm1.PauseknopfClick(Sender: TObject);
begin
  {Spiel pausieren und button pause unsichtbar --> Start sichtbar}
 pauseknopf.visible:=false;
 timer1.enabled:=false;
end;

procedure TForm1.StartknopfClick(Sender: TObject);
begin
  {macht den pauseknopf sichtbar, setzt spiel fort}
  timer1.Enabled:=true;
  pauseknopf.Visible:=True;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin

      if reflektor.left > 110 then
      begin
       case ord(key) of
        vk_left:reflektor.left:=reflektor.left-14;
       end;
      end;

      if (reflektor.left < 426) then
      begin
       case ord(key) of
         vk_right:reflektor.left:=reflektor.left+14;
       end;
      end;
   end;

procedure TForm1.Timer1Timer(Sender: TObject);
var x,y:integer;
begin
   x:=DX;
   y:=dy;

  if (Shape1.Top <= 0) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then
  begin
    y := -dy;
  end;
  if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then
  begin
    x := -dx;
  end;

  Shape1.Left := Shape1.Left + x;
  Shape1.Top := Shape1.Top + y;
end;





procedure TForm1.FormCreate(Sender: TObject);
begin
timer1.Enabled:=false;

end;

procedure TForm1.NeuesSpiel1Click(Sender: TObject);

begin
 timer1.enabled:=true;

end;

end.

EWeiss 31. Jan 2010 18:18

Re: break it problem
 
grmmm ..
Immer noch feste werte !
const dx=5;

Wie soll sich der Ball dann bewegen.

EDIT:
Blick da nicht mehr durch.
Man hat dir schon soviele vorschläge unterbreitet und du hast nichts davon angenommen.

Ich beziehe mich hier drauf.
Delphi-Quellcode:
  if (Shape1.Top <= 0) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then
  begin
    dy := -dy;
  end;
  if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then
  begin
    dx := -dx;
  end;
Scheint aber wieder verworfen zu sein.

gruss

speedy23 31. Jan 2010 18:21

Re: break it problem
 
aber ich muss der konstnten doch einen wert zuweisen? wenn ich ihr x und y zuweise ist das nicht effektiv oder?

mkinzler 31. Jan 2010 18:23

Re: break it problem
 
Zitat:

Zitat von speedy23
aber ich muss der konstnten doch einen wert zuweisen? wenn ich ihr x und y zuweise ist das nicht effektiv oder?

Rate mal warum Konstaten so heissen?

Lumpiluk 31. Jan 2010 18:23

Re: break it problem
 
dx und dy veränderst du doch, also müssen das Variablen sein. Global hast du sie aber als Konstanten desklariert und lokal dann nochmal als Variablen.
Nimm doch mal die lokalen weg und packe dx und dy noch unter das 'var' ganz oben. Die Werte (5) kannst du dann immer noch im OnCreate zuweisen...

[so viele Nachrichten in so kurzer Zeit... hoffe, es hilft trotzdem ;) ]

//Edit: Ok, ich glaube, ich war gerade ganz woanders.

speedy23 31. Jan 2010 18:36

Re: break it problem
 
verdammt also langsam komm ich gar nich mehr klar... was muss ich jetzt durch was ersetzen? ich muss den konstanten ja nen wert zuweisen das habe ich ja mit 5 oben getan ich versteh gerade nicht was da falsch ist , was muss ich machen??

wieso warst du woanders...das erscheint mir gerade komisch da ja dx die konstanten sein sollen...? wenn ich denen oben nciht 5 zuweisen soll, was denn dann?

|edit
@eweiss danke für deine hilfe, das mit dem nciht annehmen ist nicht meine absicht, ich verliere nur langsam den überblick weil das worauf du dich beziehst sollte ich ein paar posts vorher noch auf das ändern was du nun kritisierst...

kann mit nicht vllt jemand einfach konkret zeigen wo mein fehler ist? das wäre echt sehr nett, ich sitze hier seit paar stunden und ändere ständig so wie in den posts und komme nicht 1 cm weiter... :(

mkinzler 31. Jan 2010 18:37

Re: break it problem
 
In der Konstantendefinition schon

speedy23 31. Jan 2010 18:40

Re: break it problem
 
na wo denn dann sonst? oben global hab ich denen 5 zugewiesen, bitte sag mir doch einfach wo der fehler liegt i krieg hier gleich nen nervenkollaps ;)

mkinzler 31. Jan 2010 18:43

Re: break it problem
 
Pack mal das komplette Projekt und hänge es hier an

speedy23 31. Jan 2010 18:45

Re: break it problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
1000 danke an dich

rollstuhlfahrer 31. Jan 2010 19:03

Re: break it problem
 
Delphi-Quellcode:
implementation
{$R *.dfm}

var
  x,y: integer;

procedure TForm1.Timer1Timer(Sender: TObject);
var x,y:integer;
begin
  if (Shape1.Top <= 0) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then
  begin
    y := -y;
  end;
  if (Shape1.Left <= 0) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then
  begin
    x := -x;
  end;

  Shape1.Left := Shape1.Left + x;
  Shape1.Top := Shape1.Top + y;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // fehlendes... (hab ich zu voreilig gelöscht)
  x := 5;
  y := 5;
end;
Bernhard

mkinzler 31. Jan 2010 19:05

Re: break it problem
 
So sollte es funktionieren:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, sSkinManager, Buttons, sBitBtn, StdCtrls, sButton, jpeg,
  ExtCtrls, sPanel;

const dx=5;
      dy=5;
type
  TForm1 = class(TForm)
    sSkinManager1: TsSkinManager;
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    Hilfe1: TMenuItem;
    NeuesSpiel1: TMenuItem;
    Beenden1: TMenuItem;
    Image1: TImage;
    Startknopf: TsButton;
    Pauseknopf: TsBitBtn;
    reflektor: TImage;
    Shape1: TShape;
    Timer1: TTimer;
    procedure PauseknopfClick(Sender: TObject);
    procedure StartknopfClick(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure NeuesSpiel1Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var x,y:integer;

procedure TForm1.PauseknopfClick(Sender: TObject);
begin
  {Spiel pausieren und button pause unsichtbar --> Start sichtbar}
 pauseknopf.visible:=false;
 timer1.enabled:=false;
end;

procedure TForm1.StartknopfClick(Sender: TObject);
begin
  {macht den pauseknopf sichtbar, setzt spiel fort}
  timer1.Enabled:=true;
  pauseknopf.Visible:=True;
  x := dx; y := dy;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin

      if reflektor.left > 110 then
      begin
       case ord(key) of
        vk_left:reflektor.left:=reflektor.left-14;
       end;
      end;

      if (reflektor.left < 426) then
      begin
       case ord(key) of
         vk_right:reflektor.left:=reflektor.left+14;
       end;
      end;
   end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if (Shape1.Top <= image1.Top + Shape1.Height ) or (Shape1.Top >= image1.ClientHeight - Shape1.Height) then
  begin
    y := -y;
  end;
  if (Shape1.Left <= image1.Left + Shape1.Width ) or (Shape1.Left >= image1.ClientWidth - Shape1.Width) then
  begin
    x := -x;
  end;

  Shape1.Left := Shape1.Left + x;
  Shape1.Top := Shape1.Top + y;
  Shape1.Repaint;
end;





procedure TForm1.FormCreate(Sender: TObject);
begin
timer1.Enabled:=false;

end;

procedure TForm1.NeuesSpiel1Click(Sender: TObject);

begin
 timer1.enabled:=true;

end;

end.

speedy23 31. Jan 2010 19:09

Re: break it problem
 
ca. 38.000 mal danke aber nun geht er ja rechts nichtmehr an den imagerande, müsste er doch laut code eigentlich oder?

mkinzler 31. Jan 2010 19:12

Re: break it problem
 
Er stösst ja am Rande des Shapes ( nur nicht Am Rand des sichtbaten Teils) + der Schrittweite ab


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:05 Uhr.
Seite 1 von 2  1 2      

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