Speicher-Fehler beim create
Hallo Zusammen,
ich versuche mich ganz vorsichtige an Scriptern. Ich habe jetzt folgende Unit geschrieben und frage mich, warum es kracht...
Delphi-Quellcode:
Fehlermeldung:
Unit TScripterUnit;
interface uses Windows, Messages, SysUtils, Variants, Printers, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ScrMemo, ScrmPS, atScript, atPascal, Vcl.ScripterInit; Type TEvent = procedure(Sender: TObject) of object; TMyScripter=class strict protected FScript_Memo_Set: TatCustomScripter; private public constructor create; procedure Script_Memo_Ausbuchen_Set (Memo: TMemo; Pfad_SetFile: string); end; var Script: TMyScripter; implementation constructor TMyScripter.create; begin FScript_Memo_Set:=TatCustomScripter.Create(nil); //Hier kracht es end; procedure TMyScripter.Script_Memo_Ausbuchen_Set(Memo: TMemo; Pfad_SetFile: string); var Code_Memo: TMemo; begin Code_Memo:=TMemo.Create(nil); Code_Memo.Lines.LoadFromFile(Pfad_SetFile); FScript_Memo_Set.AddComponent(Memo); FScript_Memo_Set.SourceCode := Code_Memo.Lines; FScript_Memo_Set.Execute; end; initialization Script := TMyScripter.Create; finalization if Script <> nil then begin Script.Free; end; end.
Delphi-Quellcode:
Erste Gelegenheit für Exception bei $004076E3. Exception-Klasse $C0000005 mit Meldung 'access violation at 0x004076e3: read of address 0xfffffff4'. Prozess iVisitor.exe (6560)
Hat jemand eine Idee, was ich gerade falsch mache? Vielen Dank Patrick |
AW: Speicher-Fehler beim create
was passiert denn in TatCustomScripter.Create(nil);? vSchon mal mit dem Debugger durch gesteppt?
|
AW: Speicher-Fehler beim create
Das habe ich versucht: Haltepunkt eingefügt und dann mit F7 weitergegangen - der Fehler tritt sofort auf - beim ersten Mal F7 drücken...
|
AW: Speicher-Fehler beim create
Wenn es in einer Zeile "kracht", muss nicht unbedingt diese eine Zeile dafür verantwortlich sein. Manchmal ist es die Zeile davor. Nur hat dieses Konstrukt aber nur eine Zeile. Warum nur eine?
Was passiert eigentlich wenn du davor inherited an die erste Stelle einfügst? Halte ich jetzt nicht für das Problem, sollte aber auf jeden Fall rein. Schon aus Prinzip. |
AW: Speicher-Fehler beim create
Da ich TMS nicht habe und mir auch in naher Zukunft sicher nicht zulegen will, kann ich dir jetzt nicht genau sagen, was da kracht. Aber es muss an dem Konstruktor, bzw. wahrscheinlich eher man Parameter liegen. Wie heißt das Parameter denn, und was wird damit im Konstruktor dann gemacht?
|
AW: Speicher-Fehler beim create
Das hat leider keinen Effekt. Ich bekomme noch die Info, dass es eine ungültige Zeigeroperation.
Der Constructor bekommt später noch mehr Zeilen. Vielen Dank Patrick |
AW: Speicher-Fehler beim create
Also ich würde in solchem Fall versuchen das Problem einzugrenzen, und vielleicht sowas schreiben
Delphi-Quellcode:
Wenn er in nun in der Zeile davor hängen bleibt, ist das Problem vor dem Gleichzeichen, sonst dahinter. Nur eine Idee.
constructor TMyScripter.create;
begin inherited; FScript_Memo_Set:=nil; FScript_Memo_Set:=TatCustomScripter.Create(nil); //Hier kracht es end; Und nur mal als Frage, welche Parameter erwartet TatCustomScripter.Create eigentlich? Kann man das ausnilen? |
AW: Speicher-Fehler beim create
Hmm..
TatCustomScripter schein eine 'Custom' Komponente zu sein. Vielleicht kann man den nicht direkt verwenden, wie z.B. auch TStrings nicht direkt verwendet werden kann, sondern eine davon abgeleitete Class wie TStringList.. Wenn TatCustomScripter eine visuelle Komponente ist, kann es auch sein, das diese einen Owner benötigt, welcher auch gleich als Parent eingetragen wird. Nur bei nil ist da halt keiner. Anscheinend wird anschließend auf diesen zugegriffen und dann knallt es.. (Alles nur Vermutung, da ich die Kompos nicht habe...) |
AW: Speicher-Fehler beim create
Versuche mal ohne diesen initialization/finalization-Horror sondern die globale Variable einfach bei einem Button-Klick oder sonst was zu befüllen.
|
AW: Speicher-Fehler beim create
Ich vermute auch mal, dass das Problem der fehlende Owner ist.
|
AW: Speicher-Fehler beim create
Kann es sein das TatCustomScripter nicht zum diretken Createn gedacht ist, weil sie evtl. abstrakte Methoden enthält ?
Rollo |
AW: Speicher-Fehler beim create
TMS Scripter hier kann man sich Beispiele runterladen die einem hoffentlich zeigen wie es korrekt funktioniert.
workingwithscripter hier landest Du bei der Beschreibung der Script-Klassen und Methoden. Viel Erfolg! |
AW: Speicher-Fehler beim create
RTF :-)
Habe selber mal gegoogelt weil ich wissen wollte was das ist. http://www.tmssoftware.biz/business/...b/overview.htm TatScripter, TatPascalScripter, TatBasicScripter and TIDEScripter (in this document, all of these componentes are just called Scripter) descend from TatCustomScripter component, which has common properties and methods for scripting execution. The scripter has the following main features: (Fett von mir) BTW: Selber tue ich mir TMS nur an wenn es sein muss. TMS ist ein gutes Paket - um als Beispiel für schlechten Quellcode zu dienen. |
AW: Speicher-Fehler beim create / Externe Config_Datei
Hallo Zusammen,
war gesundheitlich außer Gefecht gesetzt, daher die späte Antwort... Ich habe das ein oder andere versucht, aber die Komponente scheint mir nicht schwierig zu lernen zu sein. Daher frage ich mal anders: Wenn Ihr Konfigurationen Eures Programm nicht in den HardCode und auch nicht in die DB legen wollt, sondern eine Config-Datei (vielleicht *.txt), wie macht Ihr das dann? Vielen Dank Patrick |
AW: Speicher-Fehler beim create
Ini oder Registry. Da gibt es zum Beispiel TIniFile, TRegistry, TRegIniFile, TStringList, u.v.a.
|
AW: Speicher-Fehler beim create
Hallo Zusammen,
hat jemand mal ein einfaches Beispiel, wie so etwas funktioniert? Wenn ich z.B. die Schrift von einem Memo-Feld ändern möchte, wie müsste ich das mit einer externen Datei machen?
Delphi-Quellcode:
Memo1.Font.Size:=12;
Oder wie kann ich eine Print-Procedure in eine externe Datei auslagern?
Delphi-Quellcode:
Ich habe hier keine Idee - kann mir jemand einen Hinweis/MiniBeispiel geben?
procedure TForm_Main.Etikett_drucken;
var R: TRect; Links, Oben: integer; begin Links:=50; Oben:=100; Printer.BeginDoc; //Printer.NewPage; Printer.Title:='Ausweis'; Printer.Canvas.StretchDraw(rect(Links,Oben,1550,140+Oben),Image_Logo.Picture.Graphic); Printer.Canvas.Font.Size := 12; // Schriftgröße 15 Printer.Canvas.Font.Name := 'Verdana'; // Schriftart Verdana Printer.Canvas.Font.Style:=[fsUnderline]; Printer.Canvas.TextOut(Links, Oben+150, 'Besucher-Ausweis'); Printer.Canvas.Font.Size := 12; // Schriftgröße 12 Printer.Canvas.Font.Style:=[fsBold]; Printer.EndDoc; Vielen Dank Patrick |
AW: Speicher-Fehler beim create
ini-dateien sollten Dir helfen.
|
AW: Speicher-Fehler beim create
Weil ich gerade etwas Zeit habe, das mit Font.Styles etwas kompliziert ist, und ich zufällig ein fertiges Beispiel habe
Delphi-Quellcode:
uses
IniFiles; const //Wenn man für Sections und Idents Konstanten nimmt, schleichen sich später keine Fehler ein SecOptions = 'Options'; IdFontName = 'FontName'; IdFontSize = 'FontSize'; IdFontStyle = 'FontStyle'; SecInfo = 'Info'; IdText1 = 'Text1'; IdZahl1 = 'Zahl1'; procedure TForm1.Button1Click(Sender: TObject); //in eine Ini Daten speichern var IniPath: String; IniFile: TIniFile; fsTemp: Byte; FontStyles: TFontStyles; begin //Programmpfad als Grundlage für die Ini-Datei nehmen. IniPath := ChangeFileExt(ParamStr(0), '.ini'); IniFile := TIniFile.Create(IniPath); try IniFile.WriteString(SecOptions, IdFontName, Canvas.Font.Name); IniFile.WriteInteger(SecOptions, IdFontSize, Canvas.Font.Size); FontStyles := Canvas.Font.Style; //Dieser Umweg für FontStyles ist nötig System.Move(FontStyles, fsTemp, 1); //FontStyles zum Byte-Wert konvertieren IniFile.WriteInteger(SecOptions, IdFontStyle, fsTemp); IniFile.WriteString(SecInfo, IdText1, 'Hallo Welt'); IniFile.WriteInteger(SecInfo, IdZahl1, 42); finally IniFile.Free; end; end; procedure TForm1.Button2Click(Sender: TObject); //aus einer Ini Daten landen var IniPath: String; IniFile: TIniFile; fsTemp: Byte; FontStyles: TFontStyles; s: String; i: Integer; begin //Programmpfad als Grundlage für die Ini-Datei nehmen. IniPath := ChangeFileExt(ParamStr(0), '.ini'); IniFile := TIniFile.Create(IniPath); try Canvas.Font.Name := IniFile.ReadString(SecOptions, IdFontName, 'Arial'); //Arial=Defaultwert Canvas.Font.Size := IniFile.ReadInteger(SecOptions, IdFontSize, 10); //10=Defaultwert fsTemp := IniFile.ReadInteger(SecOptions, IdFontStyle, 0); //Dieser Umweg ist nötig System.Move(fsTemp, FontStyles, 1); //SizeOf? Canvas.Font.Style := FontStyles; s := IniFile.ReadString(SecInfo, IdText1, 'Hier ein Ersatztext im Fall eines Fehlers eingeben'); i := IniFile.ReadInteger(SecInfo, IdZahl1, -1); //-1 ist der Ersatzwert im Fall eines Fehlers ShowMessage(Format('Der Text ist: "%s"; Die Zahl ist: %d', [s, i])); finally IniFile.Free; end; end; |
AW: Speicher-Fehler beim create
Vielen Dank!
Ich werde es mir vornehmen und versuchen, es nachzuvollziehen! Besten Gruß! Patrick |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 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