procedure run self

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
lycaner
Beiträge: 56
Registriert: Mi 20. Jul 2011, 13:29
OS, Lazarus, FPC: Winux (L 1.4.4 FPC 2.6.)
CPU-Target: 64 Bit AMD
Wohnort: Bern, Schweiz

procedure run self

Beitrag von lycaner »

Hallo liebe Spezialisten,

ich habe bei meinem Projekt dem Migräne Tagebuch.
http://www.lazarusforum.de/viewtopic.php?f=17&t=9368

Eine Routine aus dem OnCreate zur besseren Übersicht auslagern wollen.

Code: Alles auswählen

procedure TForm1.ifSizeOFLog(Sender: TObject);
var
  m:TMimemess;
  l:tstringlist;
  p: TMimepart;
  FLGR: Integer;
  ifSize: Integer;
  INI:TINIFile;
 fromMail,toMail,smtp,UserName,Passwort:String;
begin
FLGR := FileSize('./log/crashreport.log');
ifSize := 40960;
 
INI := TINIFile.Create('./log/crashreport.ini');
  fromMail := INI.ReadString('INIDB','from','');
  toMail := INI.ReadString('INIDB','to','');
  smtp := INI.ReadString('INIDB','smtp','');
  UserName := INI.ReadString('INIDB','User','');
  Passwort := INI.ReadString('INIDB','Password','');
 
if FLGR >= ifsize then
  m:=TMimemess.create;
  l:=tstringlist.create;
  try
    p := m.AddPartMultipart('mixed', nil);
    l.loadfromfile('./log/crashreport.log');
    m.AddPartText(l,p);
    m.AddPartBinaryFromFile('./log/crashreport.log',p);
    m.header.from:='from_e_Mail';
    m.header.tolist.add('t_e_Mail');
    m.header.subject:='Crash Report';
    m.EncodeMessage;
    // memo1.lines.assign(m.lines);
    //if you wish to send it by SMTP too, then:
    SendToRaw('fromMail', 'toMail', 'smtp', m.lines, 'UserName', 'Passwort');
  finally
    m.free;
    l.free;
  end;
  Writeln('from : '+fromMail);
  Writeln('to : '+toMail);
  Writeln('smtp : '+smtp);
  Writeln('User : '+UserName);
  Writeln('Password : '+Passwort);
  Readln;
  DeleteFile('./log/crashreport.log');
 
Nun weis ich nicht wie ich diese Procedure aufrufen kann damit sie gegebenenfalls ausgeführt wird.

Ich habe SIE wie folgt aufgerufen das klappt aber irgendwie nicht:

Code: Alles auswählen

 
Form1.ifSizeOFLog(self);
 
resp. das in Form1 liegt auch mal so:

Code: Alles auswählen

 
ifSizeOFLog(self);
 

Nun meine Frage die Ihr vielleicht besser beantworten könnt, hab ich an
der Routine etwas falsch gemacht dass sie nicht läuft ?
oder habe ich beim Einbinden in den OnCreate Prozess falsch gemacht ?


Besten Dank für die Hilfe und Grüsse

Chris
Zum GitHub Projekt für den Source bei Interesse:
https://github.com/lycaner/Migraene-Tag ... 26FileSize
Zuletzt geändert von lycaner am Mi 10. Feb 2016, 14:50, insgesamt 1-mal geändert.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: procedure run self

Beitrag von Michl »

Ich habe mir eben dein Projekt von Git gezogen. Die Procedure wird aufgerufen und kommt hier

Code: Alles auswählen

procedure TForm1.ifSizeOFLog(Sender: TObject);
...
  l:=tstringlist.create;
  try
    p := m.AddPartMultipart('mixed', nil);  //<-- hier
mit einem Runerror 219 (SIGSEV) zum stehen.

Wenn du den Debugger anstellst, dann siehst du das Problem. Da der Debugger aus ist und dieser SIGSEGV durch den Try-Finally-Block abgefangen wird, sieht es so aus, als würde die Proecdure nicht aufgerufen.

[EDIT] Fügst du noch ein begin mit zugehörigem end hier

Code: Alles auswählen

if FLGR >= ifsize then
ein, dann verschwindet auch der der SIGSEGV.

PS: Bitte schau dir mal etwas die Formatierung von anderen Programmierern an, mit einer guten Formatierung lassen sich derartige Fehler vermeiden (könntest den Code auch automatisch formatieren lassen).

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: procedure run self

Beitrag von Mathias »

Beim Procedurekopf kannst du dir den Sender sparen, dann brauchst du beim Aufruf das nil auch nicht mehr.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

lycaner
Beiträge: 56
Registriert: Mi 20. Jul 2011, 13:29
OS, Lazarus, FPC: Winux (L 1.4.4 FPC 2.6.)
CPU-Target: 64 Bit AMD
Wohnort: Bern, Schweiz

Re: procedure run self

Beitrag von lycaner »

Hallo Michl,

vielen Herzlichen Dank für Deinen Einwand, ich habe es wohl nicht mehr gemerk, ich war seit 4 Uhr in der früh am Computer und merkte es nicht mehr
dass mein Debugger aus ist, da ich die Anwendung immer separat gestartet habe. Ist aber ein Guter Vorschlag, den ich mir wieder etwas mehr behertzigen
werde.

Ich werde die SIGSEV mal durchgehen und schauen, danke Hilft mir echt weiter. Ich war Blind....

Zum besseren Code Formatieren danke ich Dir, ich bin Blutiger Neuling was Code Gestaltung angeht, OK.
Ich werde mir mühe geben das besser zu machen.
Du Sprichst von Automatischen Möglichkeiten, kannst Du mir da eventuell Weitere Angaben geben nach was ich suchen sollte
für die Formatierung des Codes ?
Michl hat geschrieben:Ich habe mir eben dein Projekt von Git gezogen. Die Procedure wird aufgerufen und kommt hier

Code: Alles auswählen

procedure TForm1.ifSizeOFLog(Sender: TObject);
...
  l:=tstringlist.create;
  try
    p := m.AddPartMultipart('mixed', nil);  //<-- hier
mit einem Runerror 219 (SIGSEV) zum stehen.

Wenn du den Debugger anstellst, dann siehst du das Problem. Da der Debugger aus ist und dieser SIGSEGV durch den Try-Finally-Block abgefangen wird, sieht es so aus, als würde die Proecdure nicht aufgerufen.

[EDIT] Fügst du noch ein begin mit zugehörigem end hier

Code: Alles auswählen

if FLGR >= ifsize then
ein, dann verschwindet auch der der SIGSEGV.

PS: Bitte schau dir mal etwas die Formatierung von anderen Programmierern an, mit einer guten Formatierung lassen sich derartige Fehler vermeiden (könntest den Code auch automatisch formatieren lassen).


Freundliche Grüsse

Chris

lycaner
Beiträge: 56
Registriert: Mi 20. Jul 2011, 13:29
OS, Lazarus, FPC: Winux (L 1.4.4 FPC 2.6.)
CPU-Target: 64 Bit AMD
Wohnort: Bern, Schweiz

Re: procedure run self

Beitrag von lycaner »

Hallo Mathias,
Mathias hat geschrieben:Beim Procedurekopf kannst du dir den Sender sparen, dann brauchst du beim Aufruf das nil auch nicht mehr.
Du meinst dass ich:

Code: Alles auswählen

procedure TForm1.ifSizeOFLog
Respektive

Code: Alles auswählen

Procedure TForm1.RunOnece_one
Und den Bereich (Sender: TObject) gar nie benötigt hätte ?

Sorry für diese Noob Frage, was ich in gewissem Sinne sicher auch binn.

Gruss

Chris

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: procedure run self

Beitrag von Michl »

lycaner hat geschrieben:Du Sprichst von Automatischen Möglichkeiten, kannst Du mir da eventuell Weitere Angaben geben nach was ich suchen sollte
für die Formatierung des Codes ?
Es gibt den Jedi Code Formatter (Package jcfidelazarus muss dazu installiert sein), mit dessen Hilfe man seinen Code automaisch (Tastenkombination CRTL + D) formatieren lassen kann. Ich bin allerdings selber kein großer Freund dieses Formatierers, da ich meinen Code für mich am besten leserlich sofort schreibe. Aber lieber automatisch formatiert, als gar nicht :wink:

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Requion
Beiträge: 106
Registriert: Mi 3. Feb 2016, 09:39
OS, Lazarus, FPC: Linux(Arch Linux(+ARM)/Minibian) (L 1.6.0 FPC 3.0.0)
CPU-Target: 32/64Bit,ARM(RPi)
Wohnort: nahe Grimma

Re: procedure run self

Beitrag von Requion »

Hallo lycaner,

die Übergabeparameter bei Funktionen und Prozeduren (hier Sender: TObject) brauchst du ja nur wenn du in der Funktion/Prozedur auf die Parameter Zugreifst. Da das in deinem Code der Prozedur nicht der Fall ist brauchst du ihn auch nicht mitgeben.

Mfg Requion
Mfg Requion

Das beste an Standards ist, dass es so viele davon gibt.

Antworten