Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Aug 17, 2025 00:26

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 60 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 13:53 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
So...also so richtig gehn tuts net. Eigentlich gehts noch überhaupt gar net. :?

So sieht der Code aus:
Code:
  1. procedure OutputToBitmap(FileName : string);
  2. var Bitmap     : TBitmap;
  3.     Dummi      : Boolean;
  4.     i,j        : integer;
  5.     h          : byte;
  6.     PixelData  : PRGBQuad;
  7.     Header     : PBitmapInfo;
  8. begin
  9.      Bitmap := TBitmap.Create;
  10.      Bitmap.PixelFormat := pf32Bit;
  11.      Bitmap.Width  := RenderForm.ClientWidth;
  12.      Bitmap.Height := RenderForm.ClientHeight;
  13.  
  14.      GetMem( PixelData, Bitmap.Width*Bitmap.Height*4 ); //Speicher für die Pixeldaten reservieren
  15.  
  16.      HptFenster.IdleHandler(HptFenster,Dummi);          //Ausgabe Zeichnen
  17.  
  18.      glReadPixels(0, 0, Bitmap.Width, Bitmap.Height, GL_RGBA, GL_UNSIGNED_BYTE, PixelData);
  19.  
  20.  
  21.      for i := 0 to Bitmap.Height * Bitmap.Width -1 do
  22.          begin // RGB -> BGR (Bitmaps speichern BGR!)
  23.               h := PixelData^.rgbBlue;
  24.               PixelData^.rgbBlue := PixelData^.rgbRed;
  25.               PixelData^.rgbRed := h;
  26.               inc(PixelData);
  27.          end;
  28.  
  29.      GetMem( Header, SizeOf( TBitmapInfoHeader ) );
  30.      with Header^.bmiHeader do
  31.      begin
  32.           biSize            := SizeOf( TBitmapInfoHeader );
  33.           biWidth           := Bitmap.Width;
  34.           biHeight          := Bitmap.Height;
  35.           biPlanes          := 1;
  36.           biBitCount        := 32;
  37.           biCompression     := BI_RGB;
  38.           biSizeImage       := Bitmap.Width*Bitmap.Height*4;
  39.      end;
  40.  
  41.      SetDIBits( Bitmap.Canvas.Handle, Bitmap.Handle, 0, Bitmap.Height, PixelData, TBitmapInfo( Header^ ), DIB_RGB_COLORS );
  42.  
  43.      Bitmap.SaveToFile(FileName);
  44.      
  45.      Bitmap.Free;
  46.      FreeMem( PixelData );
  47.      FreeMem( Header );
  48. end;


2 Fehler kommen:

1.: Das Bild ist komplett weiß.
2.: Bei FreeMem(PixelData) kommt eine "ungültige Zeigeroperation".

Bin gerade im 14.00Uhr Loch und weiß absolut net was hier net stimmt. :oops:

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 16:07 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Code:
  1.  
  2. type TTGAHEADER = packed record
  3.     tfType : Byte;
  4.     tfColorMapType : Byte;
  5.     tfImageType : Byte;
  6.     tfColorMapSpec : Array[0..4] of Byte;
  7.     tfOrigX : Array [0..1] of Byte;
  8.     tfOrigY : Array [0..1] of Byte;
  9.     tfWidth : Array [0..1] of Byte;
  10.     tfHeight : Array [0..1] of Byte;
  11.     tfBpp : Byte;
  12.     tfImageDes : Byte;
  13.   end;
  14.  
  15. procedure GLScreenShot(name : string);
  16. const MaxSize_ = 1024 * 768 * 4 + 1;
  17.  
  18. var Buffer : array of Byte;//[0..MaxSize_] of Byte;
  19.     picname : string[80];
  20.     c,i,j,temp : integer;
  21.     f : file;
  22.     tgaHeader : TTGAHEADER;
  23.     ffwidth, ffheight : integer;
  24.     viewport : Array[0..3] of integer;
  25. begin
  26.  picname := name;
  27.  
  28.  glGetIntegerv(GL_VIEWPORT, @viewport);
  29.  ffwidth := viewport[2];
  30.  ffheight:= viewport[3];
  31.  
  32.  c:= ffWidth * ffHeight * 4;
  33.  
  34.  if c>maxsize_ then Exit;
  35.  
  36.  SetLength(buffer,c);
  37.  
  38.  ZeroMemory(@tgaHeader, SizeOf(tgaHeader));
  39.  
  40.     // Fill the structure with info for the image to be saved
  41.     tgaHeader.tfImageType := 2; // TGA_RGB = 2
  42.     tgaHeader.tfWidth[0] := ffWidth and 255;
  43.     tgaHeader.tfWidth[1] := ffWidth shr 8;
  44.     tgaHeader.tfHeight[0] := ffHeight and 255;
  45.     tgaHeader.tfHeight[1] := ffHeight shr 8;
  46.     tgaHeader.tfBpp := 24;
  47.  
  48.  glReadPixels(0,0,ffWidth, ffHeight, GL_RGBA, GL_UNSIGNED_BYTE, @Buffer[0]);   // get image as 32-bit format
  49.  
  50.     // swap rgb to bgr
  51.      i := 0;
  52.      while ( i < c) do
  53.      begin
  54.         temp := buffer[i];
  55.         buffer[i] := buffer[i+2];
  56.         buffer[i+2] := temp;
  57.       inc(i,4);
  58.      end;
  59.  
  60.  c := ffwidth * ffheight * 3;
  61.  i := 0;
  62.  j := 0;
  63.  
  64.     while ( i < c) do        // convert from 32-bit to 24 bitformat
  65.     begin
  66.       Buffer[i] := Buffer[j];
  67.       Buffer[i+1] := Buffer[j+1];
  68.       Buffer[i+2] := Buffer[j+2];
  69.  
  70.       Inc(i,3);
  71.       Inc(j,4);
  72.     end;
  73.  
  74.  AssignFile(f, picname);
  75.  Rewrite( f,1 );
  76.  
  77.  BlockWrite(F, tgaHeader, SizeOf(tgaHeader));
  78.  BlockWrite(f, buffer[0], c );
  79.  
  80.  CloseFile(f);
  81.  SetLength(buffer, 0 );
  82.  
  83. end;
  84.  

Damit bekommst du eine *.tga Datei...Besser als nichts.

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 16:11 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Danke. Später vielleicht ganz gut. Aber Bitmaps machen sich für die Weiterverarbeitung ganz gut. Außerdem kann selbst Paint die Dinger lesen. ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 16:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Zitat:
tfOrigX : Array [0..1] of Byte;
tfOrigY : Array [0..1] of Byte;
tfWidth : Array [0..1] of Byte;
tfHeight : Array [0..1] of Byte;

Statt dem Typ Array[0..1] of Byte sollte hier ein Word(0..2^16-1) genutzt werden.
Das erstpart die Rechnung :wink:

Theoretisch wäre das ein super Artikel für das Wiki("Erstellen von Screenshots"), nur habe ich noch nicht die Zeit gefunden ihn zu schreiben.

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 17:15 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Stimmt. Ich hoffe einer Macht das mal. (Ich hab gerade Stress). Sogar mit verschiedenen Codes (TGA/Bitmap) würde bestimmt toll werden.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 18:05 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Zitat:
Statt dem Typ Array[0..1] of Byte sollte hier ein Word(0..2^16-1) genutzt werden.
Das erstpart die Rechnung Wink

Interesant. Kannst du das praktisch zeigen?
Auf gezeigte Art ist es sicherer und klarer zu lesen oder ?

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 20:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Hier die abgeänderte Version:
Code:
  1.  
  2. type TTGAHEADER = packed record
  3.     tfType : Byte;
  4.     tfColorMapType : Byte;
  5.     tfImageType : Byte;
  6.     tfColorMapSpec : Array[0..4] of Byte;
  7.     tfOrigX : Word; //Array [0..1] of Byte;
  8.     tfOrigY : Word;
  9.     tfWidth : Word;
  10.     tfHeight : Word;
  11.     tfBpp : Byte;
  12.     tfImageDes : Byte;
  13.   end;
  14.  
  15. procedure GLScreenShot(name : string);
  16. const MaxSize_ = 1024 * 768 * 4 + 1;
  17.  
  18. var Buffer : array of Byte;//[0..MaxSize_] of Byte;
  19.     picname : string[80];
  20.     c,i,j,temp : integer;
  21.     f : file;
  22.     tgaHeader : TTGAHEADER;
  23.     ffwidth, ffheight : integer;
  24.     viewport : Array[0..3] of integer;
  25. begin
  26.  picname := name;
  27.  
  28.  glGetIntegerv(GL_VIEWPORT, @viewport);
  29.  ffwidth := viewport[2];
  30.  ffheight:= viewport[3];
  31.  
  32.  c:= ffWidth * ffHeight * 4;
  33.  
  34.  if c>maxsize_ then Exit;
  35.  
  36.  SetLength(buffer,c);
  37.  
  38.     // Fill the structure with info for the image to be saved
  39.     ZeroMemory(@tgaHeader, SizeOf(tgaHeader));
  40.     tgaHeader.tfImageType := 2; // TGA_RGB = 2
  41.     tgaHeader.tfWidth := ffWidth // <<-----------------hier wird es weniger und einfacher
  42.     tgaHeader.tfHeight := ffHeight;
  43.     tgaHeader.tfBpp := 24;
  44.  
  45.  glReadPixels(0,0,ffWidth, ffHeight, GL_RGBA, GL_UNSIGNED_BYTE, @Buffer[0]);   // get image as 32-bit format
  46.  
  47.     // swap rgb to bgr
  48.      i := 0;
  49.      while ( i < c) do
  50.      begin
  51.         temp := buffer[i];
  52.         buffer[i] := buffer[i+2];
  53.         buffer[i+2] := temp;
  54.       inc(i,4);
  55.      end;
  56.  
  57.  c := ffwidth * ffheight * 3;
  58.  i := 0;
  59.  j := 0;
  60.  
  61.     while ( i < c) do        // convert from 32-bit to 24 bitformat
  62.     begin
  63.       Buffer[i] := Buffer[j];
  64.       Buffer[i+1] := Buffer[j+1];
  65.       Buffer[i+2] := Buffer[j+2];
  66.  
  67.       Inc(i,3);
  68.       Inc(j,4);
  69.     end;
  70.  
  71.  AssignFile(f, picname);
  72.  Rewrite( f,1 );
  73.  
  74.  BlockWrite(F, tgaHeader, SizeOf(tgaHeader));
  75.  BlockWrite(f, buffer[0], c );
  76.  
  77.  CloseFile(f);
  78.  SetLength(buffer, 0 );
  79.  
  80. end;
  81.  


Ich habe es fast auf die gleiche Art gelöst nur das ich bei dem Vertauschen der Rot und Blau Komponeten folgende Typen verwende:
Code:
  1.  
  2.  Tbgr_Format = packed record
  3.     blue : Byte;
  4.     green : Byte;
  5.     red : Byte;
  6.   end;
  7.  Pbgr_Format = ^Tbgr_Format;
  8.  Trgb_Format = packed record
  9.     red : Byte;
  10.     green : Byte;
  11.     blue : Byte;
  12.   end;
  13.  Prgb_Format = ^Trgb_Format;
  14.  


MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Zuletzt geändert von Flo am Mo Mai 23, 2005 14:54, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 21:08 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
sniper_w hat geschrieben:
Interesant. Kannst du das praktisch zeigen?
Auf gezeigte Art ist es sicherer und klarer zu lesen oder ?

Also ich würde es ja ansich einfacher zu lesen, wenn der Wert direkt in eine Variable geschrieben wird, anstatt auf 2 aufgesplittet zu werden.
Und wo das sicherer sein soll ist mir auch noch nicht ganz klar.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 21:25 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
Um noch mal auf den ursprünglichen Code zurückzukommen:

Hier inkrementierst du Pixeldata
Code:
  1.  
  2.   for i := 0 to Bitmap.Height * Bitmap.Width -1 do
  3.          begin // RGB -> BGR (Bitmaps speichern BGR!)
  4.               h := PixelData^.rgbBlue;
  5.               PixelData^.rgbBlue := PixelData^.rgbRed;
  6.               PixelData^.rgbRed := h;
  7.               inc(PixelData);
  8.          end;
  9.  


Jetzt zeigt Pixeldata auf das ende deines Datenblocks..

Code:
  1.  
  2.  SetDIBits( Bitmap.Canvas.Handle, Bitmap.Handle, 0, Bitmap.Height, PixelData, TBitmapInfo( Header^ ), DIB_RGB_COLORS );
  3.  


und nun sagst du ihm, dass er die Daten von da an (also vom Ende an) lesen soll. Dass da weiß rauskommt ist Zufall.

Code:
  1.  
  2.      Bitmap.SaveToFile(FileName);
  3.      
  4.      Bitmap.Free;
  5.      FreeMem( PixelData );
  6.  

Ah ja, und jetzt versuchst du, den Speicher am ende deines Datenblocks freizugeben. Nur den haste nie Reserviert...

Ich denke, du solltest bei der For-Schleife nen 2. Pointer verwenden. Das müsste die Probleme beheben - glaube ich...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 22:04 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
@Flo : Hast recht.

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 18, 2005 22:22 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
@Al: Danke. Werds mit mal angucken.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 19, 2005 08:35 
Offline
DGL Member

Registriert: Fr Nov 12, 2004 14:58
Beiträge: 76
Wohnort: Aachen
Ähm ja.
Also mir sind da ein paar Sachen aufgefallen.

Code:
  1.  
  2.     PixelData  : PRGBQuad;
  3.  

Eigentlich reicht hier folgendes:
Code:
  1.  
  2.     PixelData  : PByte;
  3.  

Ich weiss allerdings nicht wie Dein PRGBQuad aussieht oder ob es später Probleme mit dem SetDIBits gibt wenn Du ein einfaches PByte verwendest. Da Du nur einen Screenshot machen willst, musst Du ja nicht mehr auf die einzelnen Farben zugreifen. (Siehe nächster Absatz)

Code:
  1.  
  2.      glReadPixels(0, 0, Bitmap.Width, Bitmap.Height, GL_RGBA, GL_UNSIGNED_BYTE, PixelData);
  3.  

Wenn Du OpenGL >= 1.2 benutzt (was eigentlich bei allen halbwegs modernen Grafikkarten der Fall sein sollte) kannst Du auch die Konstante GL_BGRA verwenden.
Code:
  1.  
  2.      glReadPixels(0, 0, Bitmap.Width, Bitmap.Height, GL_BGRA, GL_UNSIGNED_BYTE, PixelData);
  3.  

Das spart die nämlich den Teil
Code:
  1.  
  2.      for i := 0 to Bitmap.Height * Bitmap.Width -1 do
  3.          begin // RGB -> BGR (Bitmaps speichern BGR!)
  4.               h := PixelData^.rgbBlue;
  5.               PixelData^.rgbBlue := PixelData^.rgbRed;
  6.               PixelData^.rgbRed := h;
  7.               inc(PixelData);
  8.          end;
  9.  

Sollte das aus irgendeinem Grund nicht gehen, brauchst Du einen Laufzeiger weil Du sonst die Start-Adresse von PixelData verlierst.

Ansonsten speichere ich die Daten immer anders in das Bitmap ab. Bin mir nicht sicher ob das schneller oder langsamer ist, funktioniert aber auf jeden Fall:

Code:
  1.  
  2.   temp := PixelData;
  3.   for j := Bitmap.Height-1 downto 0 do begin
  4.     Move(temp^,Bitmap.Scanline[j]^,Bitmap.Width*4);
  5.     inc(PChar(temp),Bitmap.Width*4);
  6.   end;
  7.  

Wobei temp auch wieder ein PByte ist (der "Laufzeiger").

Grüße

Wolf

_________________
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (Engl. Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 19, 2005 12:16 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
So geht auch *.bmp:
Code:
  1.  
  2. procedure GLScreenShot_BMP(name : string);
  3. var viewport : Array[0..3] of integer;
  4.     BMP : Graphics.TBitmap;
  5.  
  6.     Row, Size, RowSize: Integer;
  7.     pSource, pData,pAnfang: Pointer;
  8. begin
  9.  BMP := Graphics.TBitmap.Create();
  10.  BMP.PixelFormat := pf32bit;
  11.  
  12.  glGetIntegerv(GL_VIEWPORT, @viewport);
  13.  BMP.Width := viewport[2];
  14.  BMP.Height:= viewport[3];
  15.  
  16.  Size := 4;
  17.  RowSize := Size * BMP.Width;
  18.  GetMem(pSource, RowSize * BMP.Height);
  19.  pAnfang := pSource;
  20.  glReadPixels(0,0,BMP.Width, BMP.Height, GL_BGRA, GL_UNSIGNED_BYTE, pSource);   // get image as 32-bit format
  21.  
  22.       for Row := BMP.Height -1 downto 0 do
  23.       begin
  24.        pData := BMP.Scanline[Row];
  25.        if Assigned(pData) then
  26.         begin
  27.           Move(pSource^, pData^, RowSize);
  28.           Inc(PChar(pSource), RowSize);
  29.         end;
  30.       end;
  31.  
  32.  FreeMem(pAnfang, RowSize * BMP.Height);
  33.  BMP.PixelFormat := pf24bit; // optional
  34.  BMP.SaveToFile(name);
  35.  BMP.Free();
  36. end;
  37.  


//verbesserte Version

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Zuletzt geändert von sniper am Di Apr 19, 2005 13:12, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 19, 2005 12:38 
Offline
DGL Member

Registriert: Fr Nov 12, 2004 14:58
Beiträge: 76
Wohnort: Aachen
sniper_w hat geschrieben:
So geht auch *.bmp:


Was so ziemlich dem entspricht was ich oben gepostet habe bzw. schon mehrfach hier gepostet wurde.
Was ich bei Dir allerdings nicht verstehe ist das folgende:

Code:
  1.  
  2. BMP := Graphics.TBitmap.Create();
  3. BMP.PixelFormat := pf32bit;
  4. [...]
  5. // FreeMem(pSource);
  6. BMP.PixelFormat := pf24bit; // optional
  7.  


Warum setzt Du PixelFormat 2x ? Einmal auf 32bit und einmal auf 24bit.
Du verwendest keinen Laufzeiger und hast damit das Problem, das Dir Deine originale Speicheradresse verloren geht. Deswegen funktioniert das FreeMem nicht. Hat aber den Nachteil das Du je nach Bitmap-Größe eine ziemliche Speicherleicher produzierst. Nicht gut... :roll:

Grüße

Wolf

_________________
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (Engl. Sprichwort)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 19, 2005 12:53 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Zitat:
BMP.PixelFormat := pf24bit; // optional

Das hst du übersehen. Und danke für den FreeMem Hinwies.

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 60 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.020s | 13 Queries | GZIP : On ]