Autor Beitrag
catweasel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Fr 06.06.14 18:19 
Hi,

Ich bin gerade dabei mir eine Komponente für TGA files zu schreiben.
Irgendwie hakt es aber noch ein wenig. Der Quellcode ist angehängt.

Es passiert nun folgendes:

Ich lade das TGA, verändere es, zeichne es, zerstöre das Objekt und beende die Anwendung. Resultat: EInvalidPointerExcepion.
Wenn ich das TGA nur lade und zeichne, dann klappt alles wunderbar. Aber sowie ich einen "Schreibzugriff" mache geht es schief.
Was mich ein wenig verwirrt: Nach einem schreibzugriff funktioniert erstmal alles super. Wenn man neu zeichnet sieht man die Veränderung und auch beim zerstören des Objekts gibts keine Fehlermeldung. Die kommt erst wenn man die Anwendung schliessen will,
gefolgt von dem "Runtime error 217". :x

Ich bin nun nicht all zu sehr bewandert mit Zeigern, aber der Lesezugriff (GetPixel) klappt ja und das zeigerverschieben beim Schreibzugriff (SetPixel) ist ja identisch.

Vielleicht kann sich das mal jemand anschaun. Ist vermutlich recht trivial (für jemand für den Zeiger Routine sind).

Eine Sache noch: Wie müsste ich das machen wenn ich gleich einen Zeiger des Recordtypes nehme, kann ich kann nicht mit Indices auf die einzelnen Werte zugreifen, anstelle von den ganzen "inc(p)" :?:


Vielen Dank schonmal im Voraus :)

Cheers,
Catweasel
Einloggen, um Attachments anzusehen!
_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 06.06.14 18:35 
Bei mir kommt da kein Fehler (außer ich drücke doppelt auf den Knopf zum Freigeben, wobei das ja klar ist). :nixweiss:

Der Zugriff via Canvas.Pixels ist extrem langsam... besser ist eine TBitmap und ScanLine. Wenn du die dann anzeigen willst, kannst du diese ja in einem Rutsch anzeigen (Canvas.Draw, ...).
catweasel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Fr 06.06.14 19:35 
Hi,

Ich weiss das Canvas.Pixels sehr langsam ist. Das ist ja nur zu Testzwecken gedacht. :P
Später werde ich die Grafik selbst nirgendwo hin zeichnen. Der Datenzeiger wird später öffentlich.
Im Endeffekt wird das mal eine Textur für OpenGL werden :D

Ich habe das ganze mal ausserhalb der IDE laufen lassen. Hier bekomme ich nun beim beenden die Windows Meldung vom Typ
"Anwendung Tgatest.exe funktioniert nicht mehr. Online Lösung suchen, Schliessen, Debuggen".
Wenn ich auf Schliessen klicke, kommt wieder der "Runtime error 217". :?

Da das ja nur auftritt wenn ich in die Daten schreibe und ich das als Textur nur "lesend" brauche wäre es eigentlich egal das ich die Textur nicht verändern kann. Andererseits könnte man so schön Texturen aus verschiedenen channels erstellen (So Material editor mäßig). :)


Cheers,
Catweasel

_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 432
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: Sa 07.06.14 00:03 
In der UTGAImageClass.pas müssen die Zeilen 66 und 123 wie folgt sein:

Y := FHeight-Y-1;

(das "-1" fehlte)
catweasel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Sa 07.06.14 00:24 
Wow Danke :) In der Tat. So ist es immer um eine zeile danebengegangen.
Das funktioniert nun super :D

Anbei eine neue Version: Der Fehler von oben ist behoben. Der Zeigerzugriff läuft jetzt direkt über den record. Meine TGA Klase hat jetzt auch eine ScanLine funktion.

Eigentlich hatte ich das nicht vor, aber jetzt denke ich daran eine SaveToFile() Prozedur zu schreiben.
Das Lesen war ja noch recht einfach :wink: :wink:


Cheers,
Catweasel
Einloggen, um Attachments anzusehen!
_________________
Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.