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

Aktuelle Zeit: Fr Jul 04, 2025 16:30

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Feb 11, 2009 16:42 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Also mein Problem ist folgendes:
beim Aufruf von "TexturenErstellen" wird die Textur geladen, wenn ich den Link der Textur konstant angebe, z.B.: '../Texturen/Sand.bmp', wenn ich allerdings OPic.Files.GetText verwende, dann findet der die Datei nicht (OPic ist eine Klasse (?) von TOpenPictureDialog).

Code:
  1. procedure TFormStart.TexturenErstellen(TexturLink : PAnsiChar);
  2. begin
  3.   Tex := IMG_Load(TexturLink);
  4.   If assigned(Tex)
  5.     Then begin
  6.       glGenTextures  (1, @TexturAnzahl);
  7.       glBindTexture  (GL_TEXTURE_2D, TexturAnzahl);
  8.       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  9.       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  10.       glTexImage2D(GL_TEXTURE_2D, 0, 3, Tex^.w, Tex^.h, 0, GL_BGR, GL_UNSIGNED_BYTE, Tex^.pixels);                          
  11.       SDL_FreeSurface(Tex);
  12.       FormTexturManager.TexturHinzu(TexturLink, TexturLink);
  13.     end
  14.     Else ShowMessage('Textur konnte nicht geladen werden: ' + TexturLink);
  15. end;


Ich bin am verblöden, ich habe schon sämtliches rumgewurschtel im Quelltext versucht, aber ziemlich erfolglos... Schließlich will ich später die Texturpfade aus einer Datei auslesen, da kann ich ja auch nicht jede Textur im Quelltext neu reinschreiben, wenn sich was ändert.


Tex ist übrigens ein PSDL_Surface.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 11, 2009 17:09 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Versuche mal OPic.FileName.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 11, 2009 17:12 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Hatte ich zuerst versucht, aber dann meckert der mir rum das das kein PAnsiChar ist und wenn ich die Parameter für die Prozedur auf TFileName umänder, dann meckert Tex rum, da er unbedingt einen PAnsiChar will. Wie gesagt, ich habtte bereits eine Menge ausprobiert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 11, 2009 17:15 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Dann teste PAnsiChar(OPic.FileName). Ich glaube, dass es daran liegt, aber was gibt denn die Fehlermeldung aus? Ist OPic.Files.GetText keine gültige Datei?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 11, 2009 17:20 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Also mit "PAnsiChar(OPic.FileName)" Funktioniert es, komisch, wenn ich das als Textausgeben lasse, dann kommt genau dasselbe raus...
Fehlermeldung? Gab es keine, die wurde ja durch das assigned komischerweise abgefangen, weshalb der in den Else-Zweig sprang.

Dankeschön. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 12, 2009 09:06 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
String und pAnsiChar sind sehr dicht miteinander verwandt. Der einzige Unterschied ist, dass Strings noch Zusatzinfos besitzen und pAnsiChars ein abschließendes #0 Byte haben müssen. In externen Bibliotheken werden eigentlich nur nullterminierte Strings (pAnsiChar) verwendet. In Delphi genügt es einen String als pAnsiChar zu casten um ihn in einen solchen zu verwandeln. Nullterminierte Andersrum kann direkt zugewiesen werden. Konstante Texte sind automatisch bereits pAnsiChar und String kompatibel.

Der Einfachheit halber wäre es eventuell ratsam, wenn du in deiner Anwendung komplett nur mit Strings arbeitest. (TFileName ist auch nur ein Stringtyp) Und in einen pAnsiChar verwandelst du den String dann nur, wenn du ihn an IMG_Load übergibst. Das dürfte die Handhabung in deinem Code vereinfachen. Zu mindest würdest du so die Benutzung von pChar reduzieren. Wenn du unachtsam mit pAnsiChar arbeitest kann es sogar passieren, dass dir der eigentliche String vor der Nase weggelöscht wird. Da Strings einen Referenzzähler haben und du den mit pAnsiChar umgehst.

Warum das mit OPic.Files.GetText nicht funktioniert liegt daran, dass Files für Mehrfachauswahlen gedacht ist und am Ende einer jeder Datei ein Zeilenumbruch steht. IMG_load kann mit dem Zeilenumbruch aber nichts anfangen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 12, 2009 11:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Um noch einmal auf den Unterschied zwischen String und P(Ansi)Char einzugehen. Strings haben vor dem ersten Zeichen (S[1]) noch weitere Informationen im Speicher liegen. Das ist einmal die Stringlänge und einmal die Anzahl der Referenzen (Verwendungen, Variablen) des Strings.
PAnsiChar bzw PChar ist ein Typ, der zur C-Kompatibilität existiert. Der hat weder Referenzzählung noch Längenangabe, die Länge des Strings definiert sich daran, wo das erste Null-Byte auftaucht.
Pascal-Strings haben dieses Null-Byte auch, aber man kann nicht direkt darauf zugreifen (Der Aufruf von Length zählt es auch nicht mit). Außerdem ist es nicht ausschlaggebend für die Längebestimmung (man kann also getrost #0s im String haben) sondern existiert allein zur C-Kompatibilität.

Man kann also anstatt des Delphi-Spezifischen Casts PAnsiChar(S) auch @S[1] verwenden.

Und eine String-Instanz wird auf keinen Fall gelöscht, solange man noch auf eine Variable direkt(!) also nicht durch einen Pointer, wie z.B. PAnsiChar, zugreifen kann.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 17, 2009 11:03 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Ok, danke für die zusätzlichen Infos. =)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: Majestic-12 [Bot] und 0 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.007s | 16 Queries | GZIP : On ]