Error after dbgrid refresh lazarus / 16-Databases ---------------------------------------------------------------------- osda · 2020-10-28 13:49 I have a problem with my dbgrid.After a insert i   refresh my datasource  with this code :  DBGridTemperature.DataSource.DataSet.Refresh;  But i have an error " External: SIGSEGV ---------------------------------------------------------------------- JanRoza · 2020-10-28 14:00 I think you will not get any useful answer if you do not show your code, now all we have is our crystal ball and it shows nothing. ---------------------------------------------------------------------- osda · 2020-10-28 14:08 My code is here : unit UnitTemperature; {$mode objfpc}{$H+} interface uses   Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, DBGrids,   DBCtrls, ComCtrls, Menus, Buttons, ExtCtrls, LResources, RTTICtrls, TAGraph,   TASeries, TADbSource, LR_Class, LR_PGrid, ZDataset, IdTCPClient, IdComponent,   IdTCPConnection, IdGlobal, IdIMAP4, db, dbf, UnitConfig, UnitDataModule,   Types, Grids,unitbin; type   { TFormTemperature }   TFormTemperature = class(TForm)   Button1: TButton;   FindDialog1: TFindDialog;   frReport1: TfrReport;   ImageList1: TImageList;   Panel1: TPanel;   MainMenu1: TMainMenu;   Fichier: TMenuItem;   A_propos: TMenuItem;   Administration: TMenuItem;   ProgressBar_Execution: TProgressBar;   Quitter: TMenuItem;   DBGridTemperature: TDBGrid;   StatusBar1: TStatusBar;   Timer_ProgressBar: TTimer;   Timer_Execution: TTimer;   Timer_Date: TTimer;   ToolBar1: TToolBar;   btn_quit: TToolButton;   ToolButton2: TToolButton;   btn_print: TToolButton;   btn_connect: TToolButton;   btn_disconnect: TToolButton;   btn_run: TToolButton;   procedure DBGridTemperatureDrawColumnCell(Sender: TObject; const Rect: TRect;     DataCol: Integer; Column: TColumn; State: TGridDrawState);   procedure btn_disconnectClick(Sender: TObject);   procedure AdministrationClick(Sender: TObject);   procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);   procedure QuitterClick(Sender: TObject);   procedure FormCreate(Sender: TObject);   procedure StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel;     const Rect: TRect);   procedure Timer_DateTimer(Sender: TObject);   procedure Timer_ExecutionTimer(Sender: TObject);   procedure btn_quitClick(Sender: TObject);   procedure btn_printClick(Sender: TObject);   procedure btn_connectClick(Sender: TObject);   procedure btn_runClick(Sender: TObject);   procedure Timer_ProgressBarStartTimer(Sender: TObject);   procedure Timer_ProgressBarTimer(Sender: TObject);   procedure ToolBar1Click(Sender: TObject);   procedure ZTableDBGridAfterInsert(DataSet: TDataSet);   private   public   end; var   FormTemperature: TFormTemperature;   nbLigneDBF : integer;   TCPArray : array of TidTCPClient;   TrancheArray : array of String;   LocalArray : array of String; implementation {$R *.lfm} { TFormTemperature } //****************** // Procedure executée sur la creation du formulaire //***************** procedure TFormTemperature.FormCreate(Sender: TObject); begin   ProgressBar_Execution.Parent := StatusBar1;   StatusBar1.Panels.Items[3].Text:='Hors service';   StatusBar1.Panels.Items[2].Text:='Relevé toutes les '+IntToStr(Timer_Execution.Interval div 60000)+' minutes';   btn_disconnect.Enabled:= False;   btn_run.Enabled:= False; end; procedure TFormTemperature.StatusBar1DrawPanel(StatusBar: TStatusBar;   Panel: TStatusPanel; const Rect: TRect); begin   if (Timer_Execution.Enabled) then     begin     StatusBar.Canvas.Font.Color:=clGreen;     StatusBar.Canvas.TextOut(Rect.Left,Rect.Top,Panel.Text);     end   else   begin     Statusbar.Canvas.Font.Color:=clSilver;     StatusBar.Canvas.TextOut(Rect.Left,Rect.Top,Panel.Text);   end; end; procedure TFormTemperature.btn_disconnectClick(Sender: TObject); var   i:integer; begin   for i:=0 to Length(TCPArray)-1 do       TCPArray.Disconnect;   btn_disconnect.Enabled := False;   btn_run.Enabled := False;   FormTemperature.Close; end; // Met en couleur les lignes de la grille en fonction de la tranche procedure TFormTemperature.DBGridTemperatureDrawColumnCell(Sender: TObject; const Rect: TRect;   DataCol: Integer; Column: TColumn; State: TGridDrawState); begin   with DBGridTemperature do   begin   if DataSource.DataSet.FieldByName('tranche').AsString='1' then     begin       Canvas.Brush.Color:=clYellow;       Canvas.Font.Color:=clYellow;       Canvas.FrameRect(Rect);       DefaultDrawColumnCell(Rect,DataCol,Column,State);     end;   if DataSource.DataSet.FieldByName('tranche').AsString='2' then     begin       Canvas.Brush.Color:=clBlue;       Canvas.Font.Color:=clBlue;       Canvas.FrameRect(Rect);       DefaultDrawColumnCell(Rect,DataCol,Column,State);     end;   if DataSource.DataSet.FieldByName('tranche').AsString='0' then     begin       Canvas.Brush.Color:=clRed;       Canvas.Font.Color:=clRed;       Canvas.FrameRect(Rect);       DefaultDrawColumnCell(Rect,DataCol,Column,State);     end; end; end; procedure TFormTemperature.AdministrationClick(Sender: TObject); begin   FormConfig.Show; end; procedure TFormTemperature.FormCloseQuery(Sender: TObject; var CanClose: boolean); begin   CanClose :=   MessageDlg('Question','Souhaitez-vous arrêter le programme ?',mtConfirmation,[mbYes,mbNo],0)= mrYes; end; procedure TFormTemperature.QuitterClick(Sender: TObject); begin   FormTemperature.Close; end; procedure TFormTemperature.Timer_DateTimer(Sender: TObject); begin   StatusBar1.Panels.Items[0].Text:=getNow; end; // Procédure permettant de faire l'envoi et la récupération de trames procedure TFormTemperature.Timer_ExecutionTimer(Sender: TObject); var   Buffer : TIdBytes;   Hex : String;   Mesure : String;   MesureDec : Integer;   Temp : Double;   i:integer; begin   ProgressBar_Execution.Position:=0; //On initialise la progressbar à 0   for i:=0 to Length(TCPArray)-1 do  // On parcours le tableau contenant les ClientTCP   begin    // SetLength(Buffer,0); // On vide le buffer à chaque itération   //  Hex :='';   //  TCPArray.IOHandler.Write(ToBytes('0x10 0x06 0x01 0x07 0x20')); // On envoie la trame de requête   //  TCPArray.IOHandler.ReadBytes(Buffer,5,true); // On recupere la trame de donnees dans le buffer   //  Hex := TextToHex(BytesToString(Buffer,IndyTextEncoding_8bit)); // On transforme la trame en hexa   //  Mesure := copy(Hex,3,4);  // On recupere les donnes de mesure dans la trame   //  MesureDec := HexToDec(Mesure);  // On converti en decimal la mesure  //   Temp := ((MesureDec * 2500 / ( 4096 * 13.04 )) / 100 - 1 ) / 0.00358; // On applique la formule     // on arrondi 2 chiffres apres la virgule   //  Mesure := FloatToStrF(Temp,TFloatFormat(ffFixed),10,2);   //  if(Temp>30.0) then   //    FormConfig.SpinEditTimer.Value:=30;  // Si la temperature > 30 on fait des relevé toutes les 30 mins    // if(Temp<30.0) then     //  FormConfig.SpinEditTimer.Value:=FormConfig.SpinEditTimer.Tag;  // Si la temperature < 30 on fait des relevé toutes les heures     try      DataModuleBDD.ZConnection1.StartTransaction;  // On commence l'insertion de la mesure dans la base de données    // DataModuleBDD.insertTemperature(DataModuleBDD.ZQueryInsert,DateT oStr(Date),TimeToStr(Time),Mesure,LocalArray,TrancheArray);  // On fait l'insertion avec la procedure qui se trouve dans datamoduleBDD    DataModuleBDD.insertTemperature(DataModuleBDD.ZQueryInsert,DateToSt r(Date),TimeToStr(Time),'test','test','test');  // On fait l'insertion avec la procedure qui se trouve dans datamoduleBDD    DataModuleBDD.ZConnection1.Commit; // On commit l'inertion    DBGridTemperature.DataSource.DataSet.Active:=true; // On rafraichit la grille pour voir l'insertion sur l'application   ShowMessage(DBGridTemperature.DataSource.DataSet.IsEmpty.ToString());   DBGridTemperature.DataSource.DataSet.Refresh;        DBGridTemperature.Columns.BeginUpdate;     except     DataModuleBDD.ZConnection1.Rollback;   // Rollback si erreur dans l'insertion     end;   end; end; procedure TFormTemperature.btn_quitClick(Sender: TObject); begin   FormTemperature.Close; end; procedure TFormTemperature.btn_printClick(Sender: TObject); begin   frReport1.LoadFromFile('rep1.lrf'); // Charge le fichier dans lequel sera le rapport   frReport1.ShowReport; // Affiche le rapport end; procedure TFormTemperature.btn_connectClick(Sender: TObject); var   i:integer; begin   DataModuleBDD.ZConnection1.Connect; // On se connecte à la base   DataModuleBDD.ZTableDBGrid.Active:=True; // On active la table   DataModuleBDD.TableModule.Open;      // on ouvre le dbf pour recuperer les données   nbLigneDBF:= DataModuleBDD.TableModule.ExactRecordCount;  // on recupere le nb d'enregistrement dans le dbf   SetLength(TCPArray,nbLigneDBF); // on alloue dynamiquement le tableau avec la taille necessaire   SetLength(TrancheArray,nbLigneDBF); // pareil pour le tableau contenant les tranches   SetLength(LocalArray,nbLigneDBF);   DataModuleBDD.TableModule.First;                       // on se place sur le premier element   for i:=0 to Length(TCPArray)-1 do   begin     TCPArray := TIdTCPClient.Create; // Creation de TCPClients et ajout dans le tableau     TCPArray.Host:=DataModuleBDD.TableModule.FieldByName('IP').AsString; // Configuration du Host des TCPCLient     TCPArray.Port:=10001; // Configuration du Port des TCPClient     TrancheArray:=DataModuleBDD.TableModule.FieldByName('TRANCHE').AsS tring; // Remplissage du tableau des tranches     LocalArray:=DataModuleBDD.TableModule.FieldByName('LOCAL').AsString; // Remplissage du tableau des locaux     DataModuleBDD.TableModule.Next;   end;   DataModuleBDD.TableModule.Close;   // Connexion des TCPClient avec parcours du tableau  // for i:=0 to Length(TCPArray)-1 do   //  try   //    TCPArray.Connect;   //  Except   //    MessageDlg('Erreur lors de la connexion aux module de températures',mtError,[mbOk],0);   //  end;    btn_connect.Enabled:= False;     btn_run.Enabled:= True;     btn_disconnect.Enabled:= True; end; // Procedure qui lance le callback OnTimer du TimerExecution procedure TFormTemperature.btn_runClick(Sender: TObject); begin   Timer_Execution.Enabled := not Timer_Execution.Enabled;   Timer_ProgressBar.Enabled:= not Timer_ProgressBar.Enabled;   if Timer_Execution.Enabled then     begin       btn_run.ImageIndex := 5;       StatusBar1.Panels.Items[3].Text:='En service';     end   else     begin       btn_run.ImageIndex := 4;       StatusBar1.Panels.Items[3].Text:='Hors service';     end; end; // Callback OnStart du Timer ProgressBar procedure TFormTemperature.Timer_ProgressBarStartTimer(Sender: TObject); begin   Timer_ProgressBar.Interval:= Timer_Execution.Interval div 100; end; // Callback OnTimer du TimerProgressBar procedure TFormTemperature.Timer_ProgressBarTimer(Sender: TObject); begin   ProgressBar_Execution.Position:=ProgressBar_Execution.Position+1; end; procedure TFormTemperature.ToolBar1Click(Sender: TObject); begin end; procedure TFormTemperature.ZTableDBGridAfterInsert(DataSet: TDataSet); begin end; end.