FindComponent in Funktion - Absturz

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Giss
Beiträge: 22
Registriert: Sa 26. Mär 2011, 23:25
OS, Lazarus, FPC: Linux (L 0.9.28 FPC 2.4.0)
CPU-Target: 32Bit
Wohnort: Osnabrück

FindComponent in Funktion - Absturz

Beitrag von Giss »

Hallo zusammen,

ich brauche noch einmal eure Hilfe. Ich möchte gerne ein Daten aus einem StringGrid verarbeitet haben. Damit ich dieselbe Berechnung nicht bei 60 verschiedenen Grids eingeben muss, möchte ich die Berechnung in eine Funktion auslagern.

Funktion:

Code: Alles auswählen

 
function CalcGrid(const tech, day: String):String;
var
  y: integer;
  h1: real;
  SG1: string;
begin
 
  h1:=0;
  SG1:=('T'+tech+'_StringGrid'+day);
 
  for y:=1 to TStringGrid(form8.FindComponent(SG1)).RowCount -1 do
  begin
    If StrToFloat(TStringGrid(form8.FindComponent(SG1)).Cells[0,y])>0 then
    begin
      TStringGrid(form8.FindComponent(SG1)).Cells[6,y] :=
      FloatToStr(RoundTo(StrToFloat(TStringGrid(form8.FindComponent(SG1)).Cells[0,y])*
      StrToFloat(TStringGrid(form8.FindComponent(SG1)).Cells[4,y]) / 100 *
      (100-StrToFloat(TStringGrid(form8.FindComponent(SG1)).Cells[5,y])),-2));
    end
    else if StrtoFloat(TStringGrid(form8.FindComponent(SG1)).Cells[0,y])=0 then
      TStringGrid(form8.FindComponent(SG1)).Cells[6,y] := '0';
 
    h1:=StrToFloat(TStringGrid(form8.FindComponent(SG1)).Cells[6,y])+h1;
  end;
 
  result:=FloatToStr(h1);
end;
 
Aufruf:

Code: Alles auswählen

 
procedure TForm8.T1_StringGrid2EditingDone(Sender: TObject);
begin
  T1D2_Edit1.Text:=(CalcGrid('1','2'));
end;  
 

Leider stürzt das Programm ohne Fehlermeldung ab. Habt ihr einen Hinweis, woran das liegen kann?

Gruß
Christian

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: FindComponent in Funktion - Absturz

Beitrag von theo »

Als erstes würde ich mal empfehlen, das StringGrid nur einmal zu "Finden" und dann auf Nil zu prüfen.

Also irgendwie

Code: Alles auswählen

var MyGrid:TStringGrid;
...
MyGrid:= TStringGrid(form8.FindComponent(SG1));
if Assigned(MyGrid) then 
begin
 for y:=1 to MyGrid.RowCount....
 etc..

Giss
Beiträge: 22
Registriert: Sa 26. Mär 2011, 23:25
OS, Lazarus, FPC: Linux (L 0.9.28 FPC 2.4.0)
CPU-Target: 32Bit
Wohnort: Osnabrück

Re: FindComponent in Funktion - Absturz

Beitrag von Giss »

Hallo theo,

du hast recht, es geht auch übersichtlicher. :oops:

Funktion:

Code: Alles auswählen

 
function CalcGrid(const tech, day: String):String;
var
  y: integer;
  h1, faktor, preis, rabatt: real;
  SG1: string;
  MyGrid:TStringGrid ;
 
begin
 
  h1:=0;
  SG1:=('T'+tech+'_StringGrid'+day);
  MyGrid:= TStringGrid(Form8.FindComponent(SG1));
 
  if Assigned(MyGrid) then
  begin
    for y:=1 to MyGrid.RowCount -1 do
    begin
      If StrToFloat(MyGrid.Cells[0,y])>0 then
      begin
        faktor:=StrToFloat(MyGrid.Cells[0,y]);
        preis:=StrToFloat(MyGrid.Cells[4,y]);
        rabatt:=StrToFloat(MyGrid.Cells[5,y]);
        MyGrid.Cells[6,y] := FloatToStr(RoundTo(faktor * preis / 100 *
        (100-rabatt),-2));
      end
      else if StrToFloat(MyGrid.Cells[0,y])=0 then MyGrid.Cells[6,y] := '0';
 
      h1:=StrToFloat(MyGrid.Cells[6,y])+h1;
    end;
  end
  Else ShowMessage('Grid not assigned');
 
  result:=FloatToStr(h1);
end; 
 
Das Problem bleibt leider bestehen.

"Das Projet hat Exeption-Klasse >> External: SIGSEV << ausgelöst.
Bei Adresse 44CB83"

Code: Alles auswählen

0044CB83 837b1800                 cmpl   $0x0,0x18(%ebx)

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: FindComponent in Funktion - Absturz

Beitrag von theo »

Dann musst du halt mal ein bisschen debuggen. Kommentiere gewisse Blöcke aus, damit du die Schwachstelle findest.
Überlege ob alle Objekte auf die du zugreifst zum Zeitpunkt der Verwendung created sind etc.
Das wird schon! ;-)

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: FindComponent in Funktion - Absturz

Beitrag von wp_xyz »

Lazarus springt in der Regel in die Zeile, in der der Absturz passiert. Schau dir diese Zeile an: gibt es alle Objekte, die dort verwendet werden? Ich tippe in deinem Code auf die 3.Zeile "MyGrid:= TStringGrid(Form8.FindComponent(SG1));": es könnte sein, dass du die Funktion aufrufst, wenn Form8 noch gar nicht existiert, also nil ist.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: FindComponent in Funktion - Absturz

Beitrag von pluto »

Und du solltest die Variable die du mit FindComponent findest in einer Variable ablegen, und prüfen ob der Inhalt deinen gesuchten Entspricht. Dein Fenster wird bestimmt aus mehren Komponenten bestehen. Verwendest du Panls oder ähnlichs
wäre es vom Vorteil wenn du z.b. panel1.findcomponent aufrufst. Weil so findest du dann auch was. Verwendest du keine Panels sondern direkt das Fenster kannst du auch über das From gehen.
MFG
Michael Springwald

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: FindComponent in Funktion - Absturz

Beitrag von gocher »

Mich würde interessieren wieso Du nicht direkt das StringGrid übergibst, damit hättest Du schon mal eine Unbekannte aus der Gleichung?

Code: Alles auswählen

function CalcGrid(const SG: TStringGrid):String;
Stehen in Deinen Zellen Float-Werte mit ',' oder mit '.' dann kommt es bei StrToFloat auf den DecimalSeparator an!

Code: Alles auswählen

var formatSettings: TFormatSettings;
begin
  GetLocaleFormatSettings(GetUserDefaultLCID, formatSettings);
  formatSettings.DecimalSeparator := '.';
  try // für den Fall das noch andere Fehler in der Zahl sind
    f := StrToFloat(s, formatSettings);
  except
    on Exception : EConvertError do
      ShowMessage(Exception.Message); 
  end;
end; 
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Antworten