Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fehler Meldung unterdrücken (https://www.delphipraxis.net/36313-fehler-meldung-unterdruecken.html)

arbu man 18. Dez 2004 13:11


Fehler Meldung unterdrücken
 
Hi,
Mein Programm Arbeitet wunderbar, nur es spuckt die Fehler Meldung aus:
'Listenindex überschreitet Das Maximum (0)' was eigentlich nicht sein kann. Aber es läuft ja, deswegen wie kann ich diese Fehler Meldung ausschalten so dass sie nicht mehr auf dem Monitor angezeigt wird

:wall: :wall: :wall:

Meflin 18. Dez 2004 13:14

Re: Fehler Meldung unterdrücken
 
das ist keine sehr gute idee, denn der fehler ist trotzdem im prg! warscheinlich hast du bei einer schleife ein -1 oder so vergessen... du hast jedenfalls DEFINITIV einen fehler drin!

fkerber 18. Dez 2004 13:14

Re: Fehler Meldung unterdrücken
 
Hi!

Nein, dann stimmt etwas nicht.
Das einfach nur auszuschalten ist sicherlich falsch.

Wahrscheinlich hast du eine Schleife, in der du das ganze durchgehst und dann gehst du wohl etwas zu weit.
Zeig doch mal deinen Code.


Ciao Frederic

arbu man 18. Dez 2004 13:21

Re: Fehler Meldung unterdrücken
 
Delphi-Quellcode:
unit unitmain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, shellapi, ExtCtrls, unit1;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    Memo1: TMemo;
    Panel1: TPanel;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure press(Sender: TObject; var Key: Char);
  private
    { Private-Deklarationen }
  public
    procedure splitString(const Source: String; const Delimiter: String; const Dest: TStringlist);
    procedure leseein;
    procedure dobe;
    procedure add(s:string);
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  sl:tstringlist;// sl= liste in die das script geladen wird
  c:int64;// c=cursor
  forgo:integer;// forgo = gehe hinter befehle
  be:tstringlist;//be = befehl für verarbeitung
  max:int64;//max = länge der primären stringliste
  filename:string;
  b:boolean;// für das beenden
  e:boolean;// für eingabe
  es:string;// befehl für eingabe

// für script


implementation

{$R *.dfm}

function Starte(verz, appname: string): boolean;
var StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  if verz[length(verz)]<>'\' then verz:=verz+'\';
  FillChar(StartupInfo, SizeOf(TStartupInfo),0);
  StartupInfo.cb:=SizeOf(TStartupInfo);
  if CreateProcess(nil, PChar(verz+appname), nil, nil, false,
  NORMAL_PRIORITY_CLASS, nil, nil, startupinfo, ProcessInfo) then begin
    try
      WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    finally
      CloseHandle(ProcessInfo.hProcess);
      CloseHandle(ProcessInfo.hThread);
    end;
    result:=true;
  end
  else
    result:=false;
end;


procedure TForm1.splitString(const Source: String; const Delimiter: String; const Dest: TStringlist);
var count: Integer;
      LStartpos, LEndepos, LSourcelength: Integer;
      LDelimiterLength : Integer;
begin
   Dest.Clear;
   count := 1;
   LStartpos := 0;
   LEndepos := 0;
   LSourcelength := length(Source);
   LDelimiterLength := Length(Delimiter);
   while count <= LSourcelength do begin
      if copy(Source, count, LDelimiterLength) = Delimiter then begin
         LEndepos := count;
         dest.Add(copy(Source, LStartpos + 1, LEndepos - LStartpos - 1));
         LStartpos := count + LDelimiterLength - 1;
         inc(count,LDelimiterLength);
      end
      else begin
         inc(count);
      end;
   end;
   if LEndePos <> Count - LDelimiterLength then
         dest.Add(copy(Source, LStartpos + 1, count - LStartpos - 1));
end;

procedure TForm1.leseein;
var z1,z2: String;
begin
  z1:=sl[0];   // scriptnamen ermitteln
  z2:=z1+' - abu_scrit by arbutus';
  form1.Caption:=copy(z2,7,Length(z2));
  if copy(z1,0,6)<>'script' then begin
  showmessage('Die Datei ist kein gültiges abu script');
  exit;
  end;

  // hinter befehle gehen
  repeat forgo:=forgo+1; until sl[forgo]='befehle';
  c:=forgo;
  max:=sl.Count;
  dobe;
end;
Da müsste er drin sein
kommt bei print
Delphi-Quellcode:
procedure TForm1.dobe;
begin
  if e=false then begin
  if b=false then begin // zum schlißen
  // begin mit einlesen der befehle
  c:=c+1; // cursor weiter setzen
  if c>=max then begin form1.close;b:=true;exit;end else begin   // wenn liste zuende
  if sl[c]='' then begin dobe; exit;end; // bei leerstring witer
  try    // falls was schif geht
  splitString(sl[c],'|',be); //zerlege befehl
  be.Add('');// damit keine fehler kommen
  //anweisung erkennen
  if be[0]='showmessage' then {try} showmessage(be[1]);{except be.clear;end}; //showmessage fumction
  if be[0]='end' then begin form1.SetFocus; form1.Close;b:=true; exit; end; // beenden
  if be[0]='halt' then sleep(strtoint(be[1])); //hate script an
  if be[0]='install' then begin // app starten und auf ende warten
    Starte(extractfilepath(application.ExeName),be[1]);;;;end;
  if be[0]='print'then begin {try} Add(be[1]);{except be.clear;end;};end; // zeile schreiben
  if be[0]='close'then application.Terminate;// aus
  if be[0]='rechne' then begin e:=true; es:=be[0]; edit1.SetFocus; end;
  if be[0]='wait' then begin e:=true; es:=be[0]; edit1.SetFocus; end;
  finally
  be.Clear;// stringliste für nächste anweisung vorbereiten
  if b=false then dobe; // wiederholen

  end;end;end;end;
end;
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  //allgemeine einstellungen
  //ende

  sl:=tstringlist.Create;// um Datei laden zu können
  forgo:=1; // nach script {name}
  c:=1;//cursor auf ersten befehl setzen
  be:=tstringlist.create;// für befehl verarbeitung
  if paramcount <> 0 then // überprüfe ob eine datei übergeben wurde
  begin
    filename := paramstr(1);
  end;
  if filename <> '' then begin  // wenn ja lade sie
    sl.LoadFromFile(FileName); //lade datei
    form1.Show;
    leseein;
  end;
end;

procedure TForm1.add(s:string);
begin
  memo1.lines.Add(s);
  be.Clear; dobe;
end;

procedure TForm1.press(Sender: TObject; var Key: Char);
begin //bestätigung der eingabe
  if e=true then begin
  if key = #13 then begin
    add(eingabe(es,edit1.text));
    e:=false;// eingabe kommt aus unit1
    dobe;
  end;
  end;
end;

end.

arbu man 18. Dez 2004 13:28

Re: Fehler Meldung unterdrücken
 
Das ganze kann man hier runterladen
Es soll einmal ein Script Sprache werden

fkerber 18. Dez 2004 13:32

Re: Fehler Meldung unterdrücken
 
Hi!

Du solltest dir unbedingt Gedanken darüber machen, den Code besser zu strukturieren und formatieren.
Ich sehe mich nicht in der Lage, da irgendwas zu erkennen, sry.

Schau mal unter www.luckie-online.de , da gibt es Tipps dazu.


Ciao Frederic

arbu man 18. Dez 2004 14:34

Re: Fehler Meldung unterdrücken
 
Delphi-Quellcode:
procedure TForm1.dobe;// ausfüren von befehlen die im script stehen
begin
  if e=false then begin
    if b=false then begin // zum schlißen
      // begin mit einlesen der befehle
      c:=c+1; // cursor weiter setzen
       // wenn liste zuende
      if c>=max then begin form1.close;
                           b:=true;
                           exit;end else begin
         if sl[c]='' then begin dobe; exit;end; // bei leerstring weiter
         try    // falls was schif geht
           splitString(sl[c],'|',be); //zerlege befehl
           be.Add('');be.Add('');// damit keine fehler kommen
           //anweisung erkennen

           //showmessage fumction
           if be[0]='showmessage' then showmessage(be[1]);
           // beenden
           if be[0]='end' then begin form1.SetFocus; form1.Close;b:=true; exit; end;
           //hate script an
           if be[0]='halt' then sleep(strtoint(be[1]));
           // app starten und auf ende warten
           if be[0]='install' then begin
              Starte(extractfilepath(application.ExeName),be[1]);;;;end;
           // zeile schreiben
           if be[0]='print'then begin Add(be[1]);end;
           // aus
           if be[0]='close'then application.Terminate;
           // benutzer gibt eine rechnung ein die ausgerechnet wird
           if be[0]='rechne' then begin e:=true; es:=be[0]; edit1.SetFocus; end;
           // warte auf benutzer eingabe
           if be[0]='wait' then begin e:=true; es:=be[0]; edit1.SetFocus; end;
         finally
           be.Clear;// stringliste für nächste anweisung vorbereiten
           if b=false then dobe; // wiederholen
         end;
       end;
    end;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:27 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