Und jetzt bekomm ich ne Zugriffsverletzung wenn ich was zeichnen will:
Code:
//ausgeben:
fFont.TextOut('Starten',
-50, Form1.ClientHeight-100-3*MenuAbstand*50,
Form1.ClientWidth,100,
TS_ALIGN_RIGHT);
//so hab ich den vorher erzeugt:
fFont := TglFont.Create(FontContextID,
TS_STYLE_NORMAL,
20,
DataFiles+'LCD_FONT.ttf');
komischer Weise kommt der Fehler immer nur genau an der Stelle, wenn ich den Font wo anders benutz geht alles 1a?!
Ich hab den Fehler ma bis hierhin verfolgt:
TextSuiteClasses.pas --> Zeile 2115: SetLength(fScanLines, fHeight); in TtsImage.UpdateScanLines;
Ich hab mein ganzes Projekt auch ma auf den "Standart"-Font von OpenGL umgebaut, da funzt alles, aber zieht der unschön aus und deshalb würd ich schon gern die TextSuite benutzen... Kann sich das jmd erklären?!
Ma noch was nebenbei: ich hatte schon öfter Zugriffverletzungen wenn ich die TextSuit wie beschrieben benutz. Und entwerder ich mach total grundlegende Fehler oder die TextSuite is n bisl buggy (will dir damit aber nich auf die Füße treten LossyEx).
Hm, in welchem Bezug steht denn TtsImage zu deinem Code?
Existiert die Instanz dieser Klasse, wenn er in die Funktion geht? Was für eine Adresse steht bei der Zugriffsverletzung? Wenn dort eine sehr niedrige Zahl steht, kann es sein das die Variable, die die Adresse der Instanz halten soll, nil ist. Andernfalls wurde die Instanz vielleicht freigegeben oder man greift z.B. in einem Array auf einen ungültigen Index zu.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Schläfer: Die TtsImage ist eine Klasse innerhalb der TextSuite Bibliothek. Das ist ein Objekt welches Bildaten kappselt. Also alle Verarbeitungen innerhalb der TextSuite benutzen solch ein Objekt.
Bergman: Also ich behaupte jetzt einfach mal, dass du nicht die letzte Version hast die ich als Stabil ausgegeben habe. Grund dafür. Die von dir gepostetet Codestelle ist bei mir knapp 40 Zeilen weiter unten. Und die Methoden tsFontCreateCreator und tsGetErrorString haben bei mir ein A am Ende (weil AnsiStrings). Entsprechend solltest du dir die aktuelle Version ziehen und schauen ob es damit dann funktioniert. Denn in der 0.8er (die auch wirklich so heißt) habe ich noch einige Fehler beseitigt. Alles davor waren Entwicklerversionen. Und die können logischerweise Fehler enthalten. Ließ dir bitte auch durch was ich zu dem Release geschrieben habe.
Ich muss gestehen, dass ich das Konstrukt mit fZoom sehr verwirrend finde. Denn du erstellst augenscheinlich ein Font was doppelt so groß ist nur um es beim Zeichnen dann wieder halb so groß darzustellen. Denn durch so was hast du eigentlich nur nachteile. Sowohl Qualitativ als auch einen höheren Speicherverbrauch bei den Texturen. Abgesehen davon sieht der Code okay aus. Sollte das Aktualisieren der Quellen keine Besserung herbeiführen, dann versuch es bitte mal mit einem standard windows font. Wenn das geht muss es am Font liegen. Dann müsstest du mir deines mal zuschicken. Wenn das standard font auch nicht geht, dann muss es was anderes sein.
Kleine Anmerkung: Wenn du Probleme damit hast, dann fühle ich mich nicht auf die Füße getreten. Allerdings kann ich dir dabei nicht helfen, wenn du (oder egal wer) diese Probleme für dich behälst. Ich kann Fehler nur fixen, wenn ich auch davon weiß. Und bei dieser Bibliothek gibts einen sehr sehr kurzen Weg um mit dem Entwickler zu quatschen. Und das sogar noch Dialektfrei auf Deutsch. Okay. Bei Features ist der manchmal "etwas" störrisch. Aber Fehler sind in der Regel nie ein Thema. Also nutzt den kurzen Weg.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hi,
ich hab jetzt mal den ganzen Code der mit der TextSuite zu tun hat auskommentiert un da geht alles. Aber sobald ich FontContextID := CreateFontContext; wieder mit rein nehm stürzt er ab.
Dann hab ich mir die v0.8 geladen (hatte noch ne alte, aber die Idee nach ner neuen Version zu gucken kam mir erst heut früh^^). Mit der v0.8 funzt es wieder. Aber sobald ich CreateFont; (aus meiner uFont-Unit im TglFont-Creator) wieder „ein“-kommentier, kommt wieder ne Zugriffsverletzung. Komischer Weise aber erst viel später im Code wenn ich die Länge von nem Array neu setze?!
das mit dem fZoom hatte ich gemacht weil die Kanten von dem Font da net so ausgefranzt sind, aber das wollt ich sowieso nochma überarbeiten ^^
Fazit: Wenn ich den TextSuite-Code auskommentier gehts, sobald er aber drin is spinnt er an unerklärlichen Stellen rum.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Wo genau kommt denn da der Fehler? Könntest du eventuell mal durch die Methode steppen und mal schauen wo die Zugriffsverletzung her kommt? Eventuell auch mal RangeChecks und all so was aktivieren. Denn ich kann mit deiner Beschreibung gerade nicht viel anfangen. Und der Code von Oben sieht auch okay aus. Da kann ich gerade leider nicht mal sinnvoll raten.
Hattest du es mal mit einem anderen Font (Arial oder so was) probiert?
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hi,
mit nem anderen Font gehts auch net...
Un der fehler kommt jetzt in meinem Code. Wenn ich den ganzen TextSuite-Code auskommentier gehts wieder?!
jedesmal wenn ich einen Fehler halbwegs behoben hab kommt ein neuer an einer noch unerklärlicheren stelle...
(Zeile 53.)
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Du. Wenn du sagst, dass es funktioniert sobald die TextSuite auskommentiert ist, dann glaube ich das. Heißt aber nicht, dass ich dadurch wissen kann woran das Problem liegt, oder? Hatte das auch schon oft genug, dass es bei A kracht obwohl X irgendwo im Speicher murks macht. Ich persönlich arbeite eher selten mit Array on array of array. Hatte damit auch schon so das ein oder andere Problem.
Das Einzige was du ausprobieren könntest wäre die Benutzung der externen DLL. Dann sind die Speicherbereiche getrennt. Dazu müsstest du in der TextSuite.inc das Define TS_EXTERN_STATIC aktivieren.
Alternativ kann ich dir nur anbieten, dass du mir das mal schickst und ich mir das mal anschaue. Vertraulich versteht sich. Sonst wüsste ich so nicht wie ich dich dabei überhaupt unterstützen kann. Das was ich sehe sieht gut aus.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
sry wegen den vielen Wiederholungen, ich mach das öfters xD
Hab jetzt ma die DLL genommen, damit komm ich bis ins Hauptmenü meines Programms, aber sobald ich ein Untermenü auswählen will stürzt er ab. aber das geht auch nur mit Arial. Mit dem LCD-Font schmiert er gleich beim Start ab...
Wäre vlt doch besser wenn ich dir das ma schick. Ich schick dir ne PN.
€: hab grad n großen teil von meinem Code gelöscht weil ich den nochma komplet überarbeiten muss und sie da, es geht wieder alles?!
jetzt hab ich an paar anderen sachen weiter geschrieben und auf einma geht alles wieder von vorn los -.-
programm ging erst, dann hab ich EINE neue Zuweißung in ne ganz normale Varaiable gemacht und auf einma funzt gar nix mehr.
dann hab ich die TextSuite wieder auskommentiert, weil ich dachte es liegt daran, aber diesmal hat es nix geholfen (ändert sich bloß die Adresse in der fehlermeldung).
irgendwie kommt es mir so vor, als ob bei einer bestimmten Programmgröße alles verrückt spielt. Ich dachte immer so krasse Zugriffsverletzungen kann man nur bekommen wenn man nich aufpasst, was man mit seinen Zeigern macht, aber ich benutz ja noch nichma wirklich welche?! Langsam hab ich kein bock mehr auf den mist -.-
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ah. Ich sehe du hast gerade editiert. Oder es liegt am noch fehlenden Kaffee.
Zu deinen Problem. Es müssen nicht immer Zeiger sein. Nur bei Zeigern geht es besonders schnell. Was auch klassisch ist sind Arrays. Da passiert es gerne, dass man mal über die Grenzen des Arrays gerät. Bei TStream.Read kann es auch leicht passieren, dass in einen anderen Speicherbereich reingeschrieben wird. Deswegen denke ich, dass du irgendwo ein mal etwas gröber über deinen Speicherbereich schreibst und dabei andere wichtige Dinge überschreibst. Und dann bekommst du Fehler an den unterschiedlichsten Stellen. Je nachdem was gerade dort im Speicher liegt. Und dazu reicht dann wirklich schon eine solche Überschreibung.
Für so etwas solltest du zum Beispiel die Bereichsprüfung aktivieren. Bzw mal FastMM installieren. Der zeigt dir Speicherlöcher an und bei Zugriffen auf freigegebene Objektinstanzen gibts direkt Exceptions.
Generell was zu Pointern: Pointerähnliche Strukturen sind an sich nicht schlimm. Klar sie sind potentiell gefährlicher. Aber wenn man diszipliniert und aufmerksam damit arbeitet, dann hat man in der Regel wenig Böses zu erwarten. Was alternativ zu Pointer gern gemacht wird sind sehr komplexe Arraystrukturen. Arrays sind in der Verwaltung deutlich langsamer und ich habe früher bei so etwas auch häufiger Probleme gehabt. Mittlerweile benutze ich sehr oft die Kombination aus Records und TList. Das Record enthält alle Felder des jeweiligen Items. Ein Pointer auf das Record wird mit New erstellt und der Pointer dann in die Liste gepackt. Wenn er nicht mehr benötigt wird dann mit Dispose löschen. Wenn anstelle der Records Klassen sinn machen dann natürlich Klassen.
PS: Mein Angebot bleibt weiter bestehen. Da Antworte ich dir aber gleich auf die PN.
Mitglieder in diesem Forum: 0 Mitglieder und 7 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.