Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Speicher-Fehler beim create (https://www.delphipraxis.net/196156-speicher-fehler-beim-create.html)

Ykcim 26. Apr 2018 21:47

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:
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.
Fehlermeldung:
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

Lemmy 26. Apr 2018 22:05

AW: Speicher-Fehler beim create
 
was passiert denn in TatCustomScripter.Create(nil);? vSchon mal mit dem Debugger durch gesteppt?

Ykcim 26. Apr 2018 22:13

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...

Alallart 26. Apr 2018 22:37

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.

Dennis07 26. Apr 2018 22:40

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?

Ykcim 26. Apr 2018 22:43

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

Alallart 26. Apr 2018 22:57

AW: Speicher-Fehler beim create
 
Also ich würde in solchem Fall versuchen das Problem einzugrenzen, und vielleicht sowas schreiben

Delphi-Quellcode:
constructor TMyScripter.create;
begin
   inherited;
   FScript_Memo_Set:=nil;
   FScript_Memo_Set:=TatCustomScripter.Create(nil); //Hier kracht es
end;
Wenn er in nun in der Zeile davor hängen bleibt, ist das Problem vor dem Gleichzeichen, sonst dahinter. Nur eine Idee.

Und nur mal als Frage, welche Parameter erwartet TatCustomScripter.Create eigentlich? Kann man das ausnilen?

HolgerX 27. Apr 2018 04:16

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...)

Der schöne Günther 27. Apr 2018 06:04

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.

mkinzler 27. Apr 2018 07:00

AW: Speicher-Fehler beim create
 
Ich vermute auch mal, dass das Problem der fehlende Owner ist.

Rollo62 27. Apr 2018 07:46

AW: Speicher-Fehler beim create
 
Kann es sein das TatCustomScripter nicht zum diretken Createn gedacht ist, weil sie evtl. abstrakte Methoden enthält ?


Rollo

KodeZwerg 27. Apr 2018 08:00

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!

freimatz 27. Apr 2018 08:06

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.

Ykcim 30. Apr 2018 14:54

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

Alallart 30. Apr 2018 15:11

AW: Speicher-Fehler beim create
 
Ini oder Registry. Da gibt es zum Beispiel TIniFile, TRegistry, TRegIniFile, TStringList, u.v.a.

Ykcim 3. Mai 2018 16:35

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:
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;
Ich habe hier keine Idee - kann mir jemand einen Hinweis/MiniBeispiel geben?
Vielen Dank

Patrick

KodeZwerg 3. Mai 2018 16:48

AW: Speicher-Fehler beim create
 
ini-dateien sollten Dir helfen.

Alallart 3. Mai 2018 19:31

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;

Ykcim 4. Mai 2018 14:03

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