Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Prozentrechnung (https://www.delphipraxis.net/164322-prozentrechnung.html)

utd123 8. Nov 2011 09:47

Prozentrechnung
 
Hallo
Ich habe ein problem mit der Prozentrechnung in delphi 7.
Ich will den Prozentualen Anteil der Pixel in bestimmten Farben berechnen.
Die Anzahl der Pixel in den Farben habe ich schon berechnet.

Delphi-Quellcode:
//Memo3.Lines.add(floattostr((grau)/(Image1.Picture.Bitmap.Width +1 * Image1.Picture.Bitmap.Height +1)*100) + '%');
grau ist die anzahl der grauen pixel.

was habe ich falsch gemacht?

MGC 8. Nov 2011 10:10

AW: Prozentrechnung
 
Hallo,

ich würde mal sagen, dass der Gesamtansatz zur Prozentberechnung falsch ist.
Gehe es doch mal anhand eines einfachen Dreisatzes durch:

Du hast eine Fläche von Width = 100 und Height = 100 Pixeln (also 100 * 100 Pixel = 10000 Pixel)
und davon sind 5000 Pixel grau und 2500 gelb:

graue Pixel:
10000 Pexel entspricht 100%
5000 Pixel entspricht X%

X = 5000 * 100 / 10000
X= 50%

gelbe Pixel:
10000 Pixel entspricht 100%
2500 Pixel entspricht X%

X = 2500 * 100 / 10000
X = 25%

Dein Code lautet z.B. für die grauen Pixels demnach wie folgt:

Delphi-Quellcode:
PxProCent := FloatToStr(CountedGreyPixels * 100 / (Image1.Picture.Bitmap.Width * Image1.Picture.Bitmap.Height));


Wenn Du das ganze jetzt noch in eine Funktion packst und farbunabhängig gestaltest, kannst Du zu jeder Farbe gleich Deine Prozent-Angaben mit derselben Funktion ausrechnen lassen.

gammatester 8. Nov 2011 10:17

AW: Prozentrechnung
 
Du hast mindestens zwei Klammern vergessen:
Delphi-Quellcode:
(Image1.Picture.Bitmap.Width +1) * (Image1.Picture.Bitmap.Height +1)
//statt
(Image1.Picture.Bitmap.Width +1 * Image1.Picture.Bitmap.Height +1)

DeddyH 8. Nov 2011 10:19

AW: Prozentrechnung
 
Wieso eigentlich das +1 jeweils? Die Größe sollte doch Höhe * Breite entsprechen, oder gibt es da Toleranzen, die mir bislang unbekannt sind?

utd123 8. Nov 2011 10:29

AW: Prozentrechnung
 
Danke für die schnelle antwort:thumb:,
jetzt funktionierts

bernau 8. Nov 2011 10:35

AW: Prozentrechnung
 
Zitat:

Zitat von DeddyH (Beitrag 1134965)
Wieso eigentlich das +1 jeweils? Die Größe sollte doch Höhe * Breite entsprechen, oder gibt es da Toleranzen, die mir bislang unbekannt sind?

Vieleicht um eine Exception DivByZero zu umgehen?

DeddyH 8. Nov 2011 10:43

AW: Prozentrechnung
 
Das sollte man IMO ja bereits im Vorfeld ausgeschlossen haben. Nur so wie jetzt wird ja das Ergebnis (wenn auch nur geringfügig) verfälscht.

Luckie 8. Nov 2011 10:46

AW: Prozentrechnung
 
Zitat:

Zitat von bernau (Beitrag 1134968)
Zitat:

Zitat von DeddyH (Beitrag 1134965)
Wieso eigentlich das +1 jeweils? Die Größe sollte doch Höhe * Breite entsprechen, oder gibt es da Toleranzen, die mir bislang unbekannt sind?

Vieleicht um eine Exception DivByZero zu umgehen?

Also wenn das der wirkliche Grund ist und ich sein Lehrer wäre, hätte er von mir dafür einen Punkt zusätzlich bekommen wegen Kreativität. :mrgreen:

MGC 8. Nov 2011 10:47

AW: Prozentrechnung
 
Und wie hast Du das Problem jetzt gelöst?
Zeig doch mal Deine neue Code-Zeile.

mquadrat 8. Nov 2011 10:48

AW: Prozentrechnung
 
Ich tippe ja eher drauf, dass es eine leichte "in der Informatik wird ab 0 gezählt" Verwirrung war :lol:

utd123 8. Nov 2011 10:49

AW: Prozentrechnung
 
Ach eins noch: wie kann man denn die nachkommastellen begrenzen?

mquadrat 8. Nov 2011 10:51

AW: Prozentrechnung
 
Delphi-Referenz durchsuchenroundTo

DeddyH 8. Nov 2011 10:54

AW: Prozentrechnung
 
Oder wenn es nur um die Ausgabe geht: Delphi-Referenz durchsuchenFormat

utd123 8. Nov 2011 10:55

AW: Prozentrechnung
 
Hier gleich mal der gesamte Quelltext:-D
ist aber noch nicht fertig ein paar farben Fehlen noch, wie z.B.gelb:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls, ExtDlgs, jpeg, Menus, ComCtrls, MidasLib;

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    Image1: TImage;
    OpenPictureDialog1: TOpenPictureDialog;
    MainMenu1: TMainMenu;
    bildffnen1: TMenuItem;
    Memo1: TMemo;
    Memo2: TMemo;
    Memo3: TMemo;
    ProgressBar1: TProgressBar;
    Ende1: TMenuItem;
    procedure BitBtn1Click(Sender: TObject);
    procedure bildffnen1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Ende1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1:TForm1;
  y,u,v,b,r,g,maxu,maxv,minu,minv,z,maxz,minz:real;
  rot,blau,lila,gruen,schwarz,orange,grauweiss:integer;
  color:TColor;
  mein_jpeg: TJpegImage;
  mein_bmp: tBitmap;

implementation

{$R *.dfm}
procedure TForm1.bildffnen1Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute
         then
          begin
           Image1.Picture.LoadFromFile(OpenPictureDialog1.filename);
          end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  x,y:Integer;

begin
ProgressBar1.position:=0;
for x:=0 to Image1.Picture.Bitmap.Width -1 do
  begin
  //Progress Bar
  ProgressBar1.Max := Image1.Picture.Bitmap.Width +1;
  ProgressBar1.Position := ProgressBar1.Position+1;
  //Progress Bar Ende
  for y:=0 to Image1.Picture.Bitmap.Height -1 do
    begin
    color :=Image1.Picture.Bitmap.Canvas.Pixels[x,y];
    b:=getbvalue(color);
    g:=getgvalue(color);
    r:=getrvalue(color);
    z:=(0.299*r)+(0.587*g)+(0.114*b);
    u:=(b-z)*0.493;
    v:=(r-z)*0.877;
    //Memo1.Lines.Add('r: ' + floattostr(r) + ' g: ' + floattostr(g) +' b: ' + floattostr(b));
    //Memo2.Lines.add(floattostr(z) + floattostr(u) + floattostr(u));
    //start Farbe verzweigungen
      if (z>0) and (z<121)then begin
         // y = 0 - 0.33
         if (u>-112) and (u<16) and (v<157) and (v>33.64)then
            rot:=rot+1
         else begin
                if (u<8) and (u>-64) and (v<33.64) and (v>11.21)then
                    rot:=rot+1
                else begin
                    if (u<112) and (u>16) and (v<157) and (v>100.92)then
                        lila:=lila+1
                    else begin
                          if (u<112) and (u>32) and (v<100.92) and (v>33.64)then
                              blau:=blau+1
                          else begin
                              if (u<112) and (u>8) and (v<33.64) and (v>-157)then
                                  blau:=blau+1
                              else begin
                                  if (u<8) and (u>-8) and (v<11.21) and (v>-157)then
                                      gruen:=gruen+1
                                  else begin
                                      if (u<-8) and (u>-112) and (v<0) and (v>-157)then
                                          gruen:=gruen+1
                                      else begin
                                          if (u<64) and (u>-112) and (v<33.64) and (v>0)then
                                              gruen:=gruen+1
                                          else begin
                                              if (u<-8) and (u>64) and (v<11.21) and (v>0)then
                                                  gruen:=gruen+1
                                              else begin
                                                  if (u<8) and (u>-8) and (v<11.21) and (v>-11.21)then
                                                      schwarz:=schwarz+1
                                              end;
                                          end;
                                      end;
                                  end;
                              end;
                          end;
                    end;
                end;
         end;
      end
      else begin
        if (z>120) and (z<171)then begin
            //y = 86 - 170
            if (u<-16) and (u>-112) and (v<112.14) and (v>22.42)then
                orange:=orange+1
            else begin
                if (u<16) and (u>-112) and (v<157) and (v>112.14)then
                    orange:=orange+1
                else begin
                    if (u<112) and (u>-16) and (v<157) and (v>11.21)then
                        lila:=lila+1
                    else begin
                        if (u<122) and (u>8) and (v<11.21) and (v>-11.21)then
                            blau:=blau+1
                        else begin
                            if (u<112) and (u>0) and (v<-11.21) and (v>-157)then
                                blau:=blau+1
                            else begin
                                if (u<0) and (u>-112) and (v<-11.21) and (v>-157)then
                                    gruen:=gruen+1
                                else begin
                                    if (u<-8) and (u>-112) and (v<11.21) and (v>-11.21)then
                                        gruen:=gruen+1
                                    else begin
                                        if (u<8) and (u>-8) and (v<11.21) and (v>-11.21)then
                                            grauweiss:=grauweiss+1;
                                    end;
                                end;
                            end;
                        end;
                    end;
                end;
            end;
        end
        else begin
            //y = 171 - 255

        end;
      end;

    //ende Farbe verzweigungen
  end;
  end;
    Memo3.Lines.Add('Rot:' + inttostr(rot));
    Memo3.Lines.add(FloatToStr(rot * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%');
    Memo3.Lines.Add('Violett:' + inttostr(lila));
    Memo3.Lines.add(FloatToStr(lila * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%');
    Memo3.Lines.Add('Blau:' + inttostr(blau));
    Memo3.Lines.add(FloatToStr(blau * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%');
    Memo3.Lines.Add('Grün:' + inttostr(gruen));
    Memo3.Lines.add(FloatToStr(gruen * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%');
    Memo3.Lines.Add('Schwarz:' + inttostr(schwarz));
    Memo3.Lines.add(FloatToStr(schwarz * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%');
    Memo3.Lines.Add('Orange:' + inttostr(orange));
    Memo3.Lines.add(FloatToStr(orange * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%');
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.lines.Delete(0);
Memo2.lines.Delete(0);
Memo3.lines.Delete(0);
end;

procedure TForm1.Ende1Click(Sender: TObject);
begin
close;
end;

end.

mquadrat 8. Nov 2011 11:00

AW: Prozentrechnung
 
Wie wär's mit einem

Delphi-Quellcode:
if (Bedingung) then
  ...
else if (Bedingung) then
  ...
else if (Bedingung) then
  ...
?

utd123 8. Nov 2011 11:02

AW: Prozentrechnung
 
im Prinzip hab ich das doch oder?
Außer dass das if...then eine zeile weiter unten steht.

DeddyH 8. Nov 2011 11:04

AW: Prozentrechnung
 
Er meinte wohl die Einrückungen, die gehen ja im Laufe der Zeit sehr weit nach rechts. Übrigens: wozu brauchst Du die ganzen globalen Variablen und die MidasLib?

utd123 8. Nov 2011 11:08

AW: Prozentrechnung
 
Die variablen kommen aus den beta vesions zeiten alls das ganze noch nicht so funktionierte.
da hab ich mir die maximalen und die minimale y,u,v,r,g und b werte ausgeben lassen(RGB farbraum, YUV Farbraum)

Midaslib stand so im internet damit dass programm unter windows nicht mehr abstürtzt.
(machts aber trotzdem noch)

DeddyH 8. Nov 2011 11:10

AW: Prozentrechnung
 
Mach doch erst einmal aus den benötigten globalen Variablen lokale und lass die anderen weg. Zudem würde ich die Farbvariable nicht Color nennen, da das Formular eine gleichnamige Eigenschaft besitzt. Und dass das Programm abstürzt dürfte nicht an einer fehlenden MidasLib liegen.

utd123 8. Nov 2011 11:12

AW: Prozentrechnung
 
vielleicht in der end-version

utd123 8. Nov 2011 11:13

AW: Prozentrechnung
 
Aber wieso stürtzt dass dann immer noch ab :?:
ligt das vielleicht an dem color?

MGC 8. Nov 2011 11:55

AW: Prozentrechnung
 
Zitat:

Zitat von utd123 (Beitrag 1134991)
vielleicht in der end-version

Machs gleich, später wirds nur unübersichtlicher und man zerschießt mit Vorliebe erstmal wieder den Code oder verliert ganz die Lust dazu, was Dir spätestens dann wieder vor die Füße rollt, wenn Du nochmal an den Code ran willst oder musst.

utd123 8. Nov 2011 11:58

AW: Prozentrechnung
 
Na gut aber warum stürzt das programm ab wenn mann es nicht über delphi startet

DeddyH 8. Nov 2011 11:59

AW: Prozentrechnung
 
Kommt denn keine Fehlermeldung?

utd123 8. Nov 2011 12:04

AW: Prozentrechnung
 
Nein, aber nach ein paar sekunden wird das formular weiß

DeddyH 8. Nov 2011 12:06

AW: Prozentrechnung
 
Auch dann, wenn Du die Color-Variable anders nennst? Außerdem kann es gut sein, dass Dein Programm einfach etwas länger braucht, da der Zugriff über Canvas.Pixels schnarchlahm ist.

utd123 8. Nov 2011 12:54

AW: Prozentrechnung
 
wenn man es von delphi aus compiliert dann bleibt dass bild aber vorhanden und die geschwindigkeit geht auch.

DeddyH 8. Nov 2011 13:01

AW: Prozentrechnung
 
Das Programm läuft innerhalb der IDE schneller als außerhalb? Das interessiert mich jetzt aber, kannst Du mal die *.dpr, *.pas und *.dfm als Zip-Archiv anhängen?

utd123 8. Nov 2011 13:16

AW: Prozentrechnung
 
Liste der Anhänge anzeigen (Anzahl: 1)
nicht ganz richtig, außerhalb von delphi läufts gar nicht.
habs in der zwischenzeit noch verbessert so das es jetzt alle farben außer schwarz erkennt.
es geht außerdem nur mit bmp dateien.

Bummi 8. Nov 2011 13:48

AW: Prozentrechnung
 
kann es sein dass Du mit Laufzeitpaketen kompiliert hast und die bpl's nicht gefunden werden?
Ich habe den Teil der Geschwindigkeit bringt mal kurz ausgetauscht:
Delphi-Quellcode:
type
  pRGBTripleArray = ^TRGBTripleArray;
  TRGBTripleArray = ARRAY[0..$effffff] OF TRGBTriple;


procedure TForm1.BitBtn1Click(Sender: TObject);
var
  x,y:Integer;
  bmp:TBitMap;
  pLine: pRGBTripleArray;
begin
bmp := TBitmap.Create;
bmp.Assign(Image1.Picture.Bitmap);
bmp.PixelFormat := pf24Bit;
try
  //Progress Bar
  ProgressBar1.Max := Image1.Picture.Bitmap.Width +1;
  //Progress Bar Ende

Memo3.lines.Delete(0);
ProgressBar1.position:=0;
  for Y := 0 to bmp.Height - 1  do

  begin
    ProgressBar1.Position := ProgressBar1.Position+1;
    pLine := bmp.ScanLine[Y];
    for x := 0 to bmp.Width -1 do
        begin
          b := pLine[x].rgbtBlue;
          r := pLine[x].rgbtRed;
          g := pLine[x].rgbtGreen;
          z:=(0.299*r)+(0.587*g)+(0.114*b);
          u:=(b-z)*0.493;
          v:=(r-z)*0.877;
            if (z>0) and (z<121)then begin
               // y = 0 - 0.33
               if (u>-112) and (u<16) and (v<157) and (v>33.64)then
                  rot:=rot+1
               else begin
                      if (u<8) and (u>-64) and (v<33.64) and (v>11.21)then
                          rot:=rot+1
                      else begin
                          if (u<112) and (u>16) and (v<157) and (v>100.92)then
                              lila:=lila+1
                          else begin
                                if (u<112) and (u>32) and (v<100.92) and (v>33.64)then
                                    blau:=blau+1
                                else begin
                                    if (u<112) and (u>8) and (v<33.64) and (v>-157)then
                                        blau:=blau+1
                                    else begin
                                        if (u<8) and (u>-8) and (v<11.21) and (v>-157)then
                                            gruen:=gruen+1
                                        else begin
                                            if (u<-8) and (u>-112) and (v<0) and (v>-157)then
                                                gruen:=gruen+1
                                            else begin
                                                if (u<64) and (u>-112) and (v<33.64) and (v>0)then
                                                    gruen:=gruen+1
                                                else begin
                                                    if (u<-8) and (u>64) and (v<11.21) and (v>0)then
                                                        gruen:=gruen+1
                                                    else begin
                                                        if (u<8) and (u>-8) and (v<11.21) and (v>-11.21)then
                                                            schwarz:=schwarz+1
                                                    end;
                                                end;
                                            end;
                                        end;
                                    end;
                                end;
                          end;
                      end;
               end;
            end
            else begin
              if (z>120) and (z<160)then begin
                  //y = 86 - 170
                  if (u<-16) and (u>-112) and (v<112.14) and (v>22.42)then
                      orange:=orange+1
                  else begin
                      if (u<16) and (u>-112) and (v<157) and (v>112.14)then
                          orange:=orange+1
                      else begin
                          if (u<112) and (u>-16) and (v<157) and (v>11.21)then
                              lila:=lila+1
                          else begin
                              if (u<122) and (u>8) and (v<11.21) and (v>-11.21)then
                                  blau:=blau+1
                              else begin
                                  if (u<112) and (u>0) and (v<-11.21) and (v>-157)then
                                      blau:=blau+1
                                  else begin
                                      if (u<0) and (u>-112) and (v<-11.21) and (v>-157)then
                                          gruen:=gruen+1
                                      else begin
                                          if (u<-8) and (u>-112) and (v<11.21) and (v>-11.21)then
                                              gruen:=gruen+1
                                          else begin
                                              if (u<8) and (u>-8) and (v<11.21) and (v>-11.21)then
                                                  grauweiss:=grauweiss+1;
                                          end;
                                      end;
                                  end;
                              end;
                          end;
                      end;
                  end;
              end
              else begin
              //y = 160 - 255
              if z>159 then begin
                  if (u<-32) and (u>-112) and (v<157) and (v>-44.85)then
                      gelb:=gelb+1
                  else begin
                      if (u<-24) and (u>-32) and (v<22.42) and (v>-44.85)then
                          gelb:=gelb+1
                       else begin
                        if (u<112) and (u>-32 ) and (v<157) and (v>22.42)then
                            lila:=lila+1
                        else begin
                            if (u<112) and (u>24 ) and (v<22.42) and (v>-11.21)then
                                lila:=lila+1
                            else begin
                                if (u<112) and (u>-24) and (v<-11.21) and (v>-157)then
                                    blau:=blau+1
                                else begin

                                end;
                            end;
                        end;
                       end;
                  end;
              end;
              end;
            end;

    //ende Farbe verzweigungen
  end;
  end;
    Memo3.Lines.Add('Rot:' + inttostr(rot));
    Memo3.Lines.add(FloatToStr(rot * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%');
    Memo3.Lines.Add('Violett:' + inttostr(lila));
    Memo3.Lines.add(FloatToStr(lila * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%');
    Memo3.Lines.Add('Blau:' + inttostr(blau));
    Memo3.Lines.add(FloatToStr(blau * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%');
    Memo3.Lines.Add('Grün:' + inttostr(gruen));
    Memo3.Lines.add(FloatToStr(gruen * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%');
    Memo3.Lines.Add('Schwarz:' + inttostr(schwarz));
    Memo3.Lines.add(FloatToStr(schwarz * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%');
    Memo3.Lines.Add('Orange:' + inttostr(orange));
    Memo3.Lines.add(FloatToStr(orange * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%');
    Memo3.Lines.Add('Gelb:' + inttostr(gelb));
    Memo3.Lines.add(FloatToStr(gelb * 100 / (Image1.Picture.Width * Image1.Picture.Height)) + '%');

finally
  bmp.Free;
end;
end;

utd123 8. Nov 2011 14:02

AW: Prozentrechnung
 
sorry aber was meinst du mit den laufzeitpaketen und bpl`s :oops:

Bummi 8. Nov 2011 14:38

AW: Prozentrechnung
 
Bei mir kompiliert und läuft es mit/ohne IDE
Eine Erklärung für Deinen Fehler wäre dass Du unter Projekt/Optionen/Mit Laufzeit-Packages aktualisieren angehakt hast und das Programm auf einen Rechner Testet wo die dann benötigten BPL's (bei Dir wahrscheinlich im Windowsverzeichnis) nicht vorhanden sind.

utd123 9. Nov 2011 08:03

AW: Prozentrechnung
 
Nein ich hab es nicht angehackt.
und ich teste es auch auf dem selben rechner wo ich es geschrieben hab.

MGC 9. Nov 2011 10:13

AW: Prozentrechnung
 
Hast Du dieses Problem bereits von Anfang an gehabt oder hat sich diese/dieses Verlangsamung/Aufhängen erst zwischendrin irgendwann eingestellt?
Zeichnest Du die ausgezählte Grafik selbst oder wird sie geladen?

Ich hatte mal das Problem mit einem Icon, das es sich in einem Projekt beim einen Compilieren hat laden lassen, beim nächsten wieder nicht.
War sehr seltsam und konnte nur beseitigt werden, indem ich die Icon-Datei neu angelegt habe.

In einem anderen Thread der hier in der DP vor kurzem aktuell war, konnte ein Formular unter WIN XP anscheinend nicht richtig mit Verzögerung ausgeblendet werden, obwohl es keinen ersichtlichen Grund gab. Besodners lustig war dabei, das es unter Win 7 mit dem selben Compilat funktioniert hat.
Hier half nur das Projekt neu aufzusetzen.

Es ist manchmal lustig, aber oft hilft es eine Datei oder das Projekt selbst nochmal neu anzulegen und schon funktionieren die Dinge, bei denen man vorher so lange nach seinen eigenen Fehlern gesucht hat.

utd123 9. Nov 2011 11:59

AW: Prozentrechnung
 
danke ich werds versuchen

Blup 9. Nov 2011 15:42

AW: Prozentrechnung
 
Zitat:

Delphi-Quellcode:
                                                    if (u<-8) and (u>64) and (v<11.21) and (v>0)then
                                                        gruen:=gruen+1

Der Wertebereich für u ist an dieser Stelle falsch angegeben.

utd123 10. Nov 2011 08:43

AW: Prozentrechnung
 
Ja stimmt aber dann fehler habe ich auch schon mitbekomme und habe ihn berichtigt :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 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