Seltsames Ergebnis zwischen Debug und Laufzeit [gelöst]

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Seltsames Ergebnis zwischen Debug und Laufzeit [gelöst]

Beitrag von and4more »

Hallo liebes Forum,
bin mal wieder auf was Seltsames gestoßen, und zwar führt der unten stehende Code zu einem richtigen/erwünschten Verhalten während des Debug-Modes, aber während der Laufzeit wird dann nur das erste Zeichen richtig gefiltert, danach nicht mehr weiter. Habe jetzt schon alles Mögliche versucht (Code umgeschrieben, Funktion geändert) aber während der Laufzeit funktioniert das Ganze nicht mehr. Daher hilft mir der Debug-Mode auch nicht weiter. Hat jemand irgendeine Idee? Vielleicht stehe ich ja auch nur auf der Leitung?!? Im Eingabefeld der den String übergebenden Combobox werden die Tastendrücke mittels:

Code: Alles auswählen

 
function DB_Eingabe(var key:Char):Char;
begin
  if (key in ['0'..'9','.',':',';','_','<','>','+','*','~','#']) then key:=#0;
  Result:=key;
end;
 


gefiltert, sodass nicht irgendein Blödsinn dort landet. Die "aufrufende" Funktion, die dann das Grid filtern soll geht wie folgt:

Code: Alles auswählen

 
procedure TFrmShowArchiv.UpdateDBGrid(DBStr:String='');
var
  u,lstr:Integer;
  i:Integer=0;
  strNN,strVN,strDBin,strVNTemp:String;
begin
  with FrmMain.dbfArchiv do begin
    if not ControlsDisabled then DisableControls;
   //falls Vorname angegeben, auch diesen filtern
    FilterOptions:=[foCaseInsensitive];
    Filtered:=False;
    strDBin:=Trim(DBStr);
    i:=Pos(',',strDBin);
    strVN:='';
    strNN:='';
    if (i=1) then begin   //wenn Komma am Anfang steht...
      CBoxPat.Text:='';   //...löschen, da nicht verwertbar
      Exit;
    end;
    if (Length(strDBin)>0) then begin //wenn 1 Zeichen oder mehr
      if (i>0) then begin   //wenn Komma vorhanden
        strDBin:=Entferne_Zeichen(strDBin,','); //alle Kommata bis auf eins entfernen
        strNN:=Copy(strDBin,1,i-1);  //trenne Nachnamen
        strVNTemp:=Copy(strDBin,i+1,Length(strDBin));  //und Vornamen
        if (strVNTemp<>'') then begin  //wenn Vorname vorhanden
          lstr:=Length(strVNTemp);
          for u:=1 To lstr do begin
            if strVNTemp[u] in ['a'..'z'] then strVN:=Copy(strVNTemp,1,u)
            else Exit;
          end;
        end;
      end;
      if (i>0) then lstr:=Length(strNN)
      else lstr:=Length(strDBin);
      for u:=1 To lstr do
        if strDBin[u] in ['a'..'z'] then strNN:=Copy(strDBin,1,u)
        else Exit;
      if (strVN<>'') then //wenn Vorname > 0 Zeichen
        //Filter nach Nachname und Vorname
        Filter:=Format('NNAME="%s" and VNAME="%s"',[strNN+'*',strVN+'*'])
      else Filter:=Format('NNAME="%s"',[strNN+'*']);
      Locate('NNAME',Format('"%s"',[strNN]),[loCaseInsensitive,loPartialKey]);
    end;
    //Suche mit Soundex (klappt so nicht)
    //Filter:=Format('SOUNDX="%s"',[Soundex(strDBin)]);
    if (Length(CBoxPat.Text)<1) then Filtered:=False
    else Filtered:=True;
    if ControlsDisabled then EnableControls;
  end;
end;       
 


Die Hilfsfunktion die die Kommata aussortiert (bis auf eins):

Code: Alles auswählen

 
function Entferne_Zeichen(s:string;c:Char): string;
var
  i: integer;
  strKTemp,strSave:String;
begin
  strKTemp:=s;
  i:=Pos(c,strKTemp);
  //überzählige Sonderzeichen bis auf eins ausfiltern...
  while (i>0) do begin
    strSave:=strKTemp; 
    strKTemp:=Copy(strKTemp,1,i-1);
    i:=Pos(c,strKTemp);
  end;
  Result:=strSave;
end;
 


Gerade gemerkt, dass der obige Code noch nicht optimal ist, falls nach den Kommata noch Text (Vorname) stehen sollte. Muss ich noch anpassen, hat aber keine Auswirkung auf das o. g. Problem
Auffällig ist, dass die ComboBox im Debug-Mode nicht die passenden Namen wie zur Laufzeit bereits anzeigt. Ih weiß nicht, ob dies was mit dem veränderten Verhalten zu tun hat. Die ComboBox wird folgendermaßen gefüllt:

Code: Alles auswählen

 
procedure TFrmShowArchiv.FillComboBox;
var
  i:Integer;
  strName,strNN,strVN:String;
begin
  try
    //ShowMessage('FrmShowArchiv.FillComboBox');
    if (FrmMain.InitializeDBF(dbfPfad,dbfName)=False) then Exit;
    with FrmMain.dbfArchiv do begin
      DisableControls;     //beschleunigte Ausführung
      Active:=True;
      Filtered:=False;
      First;
      //Combobox füllen
      CBoxPat.Clear;
      if (RecordCount>0) then begin
        i:=RecordCount;
        while not EOF do begin
          strNN:=FieldByName('NNAME').AsString;
          strVN:=FieldByName('VNAME').AsString;
          strName:=strNN+', '+strVN;
          CBoxPat.Items.Add(strName);
          i:=i-1;
          if (i=0) then Break else Next;
        end;
      end;
      EnableControls;
      CBoxPat.SetFocus;
    end;
  except
      on E: EDatabaseError do begin
        MessageDlg('Fehler','Datenbankfehler: '+E.Message,mtError,[mbOK],0);
      end;
  end;   // Ende 'try...except'
end;
 


Habe momentan echt keinen Plan und wäre für jeden Hinweis dankbar. Vielen Dank schon mal für die Mühe.
Zuletzt geändert von and4more am Fr 1. Sep 2017, 18:12, insgesamt 1-mal geändert.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Seltsames Ergebnis zwischen Debug und Laufzeit

Beitrag von and4more »

Nachtrag: Die Funktion wird bei dem Ereignis OnChange ausgeführt, wenn also in der ComboBox eine Änderung erfolgt.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Seltsames Ergebnis zwischen Debug und Laufzeit

Beitrag von and4more »

...habe unerwarteter Weise die Lösung jetzt doch gefunden. Wie ich bereits vermutet habe war das Problem mit der ComboBox zusammenhängend. Als ich die AutoComplete-Checkbox ausgeschaltet hatte funktionierte der Code genauso wie im Debugger. Etwas seltsam, dass der Debugger die Programmeinstellungen "umgeht".
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

Antworten