[lazarus] MySQL and Lazarus.

Rainer Hamann rainer at hamann-kiel.de
Wed Feb 19 15:42:37 EST 2003


You need a mysql database corresponding to the application, which is in 
German:-(( Do you see any change to understand a German application? I'll 
send you the project with database definitions tomorrow.

Regards,

Rainer Hamann

>  --- Rainer Hamann <rainer at hamann-kiel.de> escribió: > I've a very
> small component called TMySQLDB, which encapsulates
>
> > mysql.pas,
> > which is part of the fpc compiler. You will find it as attachment.
> > Another
> > component creates datagrids based on TMySQLDB and TStringGrid from
> > Jesus R.,
> > but this component has one bug, because one has to click on another
> > cell
> > before the upper left one can be used.
> >
> > Rainer Hamann
> >
> > > There ins`t database components for lazarus as is in delphi?
> > > Where can i find some exemple codes for acessing MySQL from
> >
> > lazarus?
> >
> > > I`m used to mysql++ in c++ and got only sigv(Access violation) in
> >
> > my
> >
> > > tryings,i`m not used to pascal anymore(i once were a delphi
> >
> > programer but
> >
> > > from many years ago i work most with c++ and some tcl).
> > >
> > > _________________________________________________________________
> > >      To unsubscribe: mail lazarus-request at miraclec.com with
> > >                 "unsubscribe" as the Subject
> > >    archives at http://www.lazarus.freepascal.org/mailarchives
> > > unit datagrid;
> >
> > {$mode objfpc}{$H+}
> >
> > interface
> >
> > uses
> >   Classes, SysUtils, Controls, StdCtrls, ExtCtrls, Buttons,
> > dynamicarray, grids,
> >   Calendar, Dialogs, LCLType, Forms, LMessages, Messages, FMySQLDB;
> >
> > type
> >   TColEditor = (dgNone, dgEdit, dgComboBox, dgDate);
> >   TOkDirection = (okRight, okDown);
> >
> >   TDatePicker = class(TPanel)
> >         Calendar : TCalendar;
> >         Ok : TButton;
> >      public
> >         constructor Create(AOwner: TComponent);
> >         destructor Destroy;
> >   end;
> >
> >   TOnCellChange = procedure(NewContent : string; ColNr, RowNr :
> > integer) of Object;
> >   TOnCellEnter = procedure(ColNr, RowNr : integer) of Object;
> >
> >   TDataGrid = class(TStringGrid)
> >         Timer : TTimer;
> >      private
> >         eRow, eCol, eRowLast, eColLast : integer;     // selected
> > cell, editing enabled
> >         IsTopLeftChange, TimerFirst : boolean;
> >         LastEditText : string;
> >         procedure LMExit(var Msg: TLMExit); message LM_EXIT;
> >         function GetDBIndex(DBCol, DBRow: Integer): string;
> >         procedure SetDBIndex(DBCol, DBRow: Integer; const AValue:
> > string);
> >      public
> >         FDBIndex : TArray;
> >         OnCellChange : TOnCellChange;
> >         OnCellEnter : TOnCellEnter;
> >         OnEditorChange : TOnCellChange;
> >      public
> >         ColEditor : array[0..MaxSpalten] of TWinControl;
> >         ColEditorIsCopy : array[0..MaxSpalten] of boolean;
> >         ColEditorType : array[0..MaxSpalten] of TColEditor;
> >         OkDirection : TOkDirection;
> >         constructor Create(AOwner: TComponent); override;
> >         destructor Destroy; override;
> >         property DBIndex[ACol, ARow : integer] : string read
> > GetDBIndex write SetDBIndex;
> > //        property ColCount: integer read FColCount write
> > SetColCount;
> > //        property RowCount: integer read FRowCount write
> > SetRowCount;
> >         procedure ChangeCellSelected(NewText : string);
> >         procedure ClearGrid(ColStart, RowStart : integer);
> >         procedure ComboBoxChange(Sender : TObject; var Key : char);
> >         procedure ComboBoxKeyDown(Sender : TObject; var Key: Word;
> > Shift: TShiftState);
> >         procedure CopyEditType(FromCol, ToCol : integer);
> >         procedure DateClick(Sender : TObject);
> >         procedure EditExit;
> >         procedure EditKeyDown(Sender : TObject; var Key: Word;
> > Shift: TShiftState);
> >         procedure EditorToCell(OldCol, OldRow : integer; var
> > NewCol, NewRow : integer; var ok : boolean);
> >         procedure KeyDown(var Key: Word; Shift: TShiftState);
> > override;
> >         procedure SelectCell(ColNr, RowNr : integer);
> >         procedure SelectEditType(ColNr : integer; EditType :
> > TColEditor);
> >         procedure Selection(Sender: TObject; ColNr, RowNr :
> > integer);
> >         procedure TimerEvent(Sender : TObject);
> >         procedure TopLeftChanged(Sender : TObject);
> >   end;
> >
> > implementation
> >
> > uses
> >     LowLevelProcs;
> >
> > constructor TDatePicker.Create(AOwner: TComponent);
> > begin
> >      inherited Create(AOwner);
> >      Calendar := TCalendar.Create(AOwner);
> >      Calendar.Parent := self;
> >      Calendar.Top := 0;
> >      Calendar.Left := 0;
> >      Calendar.Visible := true;
> >      Ok := TButton.Create(AOwner);
> >      Ok.Parent := self;
> >      Ok.Caption := 'ok';
> >      Ok.Left := 0;
> >      Ok.Top := Calendar.Height + 1;
> >      Ok.Height := 24;
> >      Ok.Width := Calendar.Width;
> >      Ok.Visible := true;
> >      Width := Calendar.Width;
> >      Height := Calendar.Height + Ok.Height + 2;
> > end;
> >
> > destructor TDatePicker.Destroy;
> > begin
> >      Calendar.Free;
> >      Ok.Free;
> >      inherited;
> > end;
> >
> >
> > constructor TDataGrid.Create(AOwner: TComponent);
> > var
> >    n : integer;
> > begin
> >      inherited Create(AOwner);
> >      for n := 0 to MaxSpalten do begin
> >          ColEditor[n] := nil;
> >          ColEditorIsCopy[n] := false;
> >      end;
> >      eCol := -1;
> >      eRow := -1;
> >      IsTopLeftChange := false;
> >      LastEditText := '';
> >      OkDirection := okRight;
> >      OnSelection := @Selection;
> >      OnTopLeftChange := @TopLeftChanged;
> >      OnCellChange := nil;
> >      OnCellEnter := nil;
> >      OnEditorChange := nil;
> >      FDBIndex := TArray.Create;
> >      FDBIndex.SetLength(MaxSpalten, MaxZeilen);
> >      Timer := TTimer.Create(self);
> >      Timer.Enabled := false;
> >      Timer.Interval := 100;
> >      Timer.OnTimer := @TimerEvent;
> > end;
> >
> > destructor TDataGrid.Destroy;
> > var
> >    n : integer;
> > begin
> >      for n := 0 to MaxSpalten do begin
> >          if not ColEditorIsCopy[n] and (ColEditor[n] <> nil) then
> > begin
> >             ColEditor[n].Free;
> >          end;
> >      end;
> >      Timer.Free;
> >      FDBIndex.Free;
> >      inherited;
> > end;
> >
> > procedure TDataGrid.LMExit(var Msg: TLMExit);
> > var
> >    ok : boolean;
> > begin
> >      if ColEditor[eCol] <> nil then begin
> >         EditorToCell(eCol, eRow, eCol, eRow, ok);
> >      end;
> > end;
> >
> > procedure TDataGrid.ClearGrid(ColStart, RowStart : integer);
> > var
> >    i, n : integer;
> > begin
> >      if (eCol >= 0) and (ColEditor[eCol] <> nil) then begin
> >         ColEditor[eCol].Hide;
> >      end;
> >      for i := RowStart to RowCount-1 do begin
> >          for n := ColStart to ColCount-1 do begin
> >              Cells[n, i] := '';
> >              DBIndex[n, i] := '';
> >          end;
> >      end;
> > end;
> >
> > procedure TDataGrid.ChangeCellSelected(NewText : string);
> > begin
> >      if (eCol >= 0) and (eRow >= 0) {and (Cells[eCol, eRow] <>
> > NewText)} then begin
> >         Cells[eCol, eRow] := NewText;
> >         if OnCellChange <> nil then begin
> >            OnCellChange(Newtext, eCol, eRow);
> >         end;
> >      end;
> >      eColLast := eCol;
> >      eRowLast := eRow;
> >      eCol := -1;
> >      eRow := -1;
> > end;
> >
> > procedure TDataGrid.ComboBoxChange(Sender : TObject; var Key :
> > char);
> > var
> >    n : integer;
> >    exists : boolean;
> > begin
> >      if (eCol >= 0) and (ColEditor[eCol] <> nil) then begin
> >         Application.ProcessMessages;
>
> === message truncated ===> unit fmysqldb;
>
> > {$mode objfpc}{$H+}
> >
> > interface
> >
> > uses
> >   Classes, SysUtils, Forms, Controls, Graphics, Dialogs,
> > LResources, mysql, grids;
> >
> > const
> >      MaxSpalten = 20;
> >      MaxZeilen = 1000;
> >      MaxTables = 200;
> >      Alpha = ['a'..'z', 'A'..'Z', 'ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü',
> > 'ß', '_'];
> >      AlphaNumeric = ['0'..'9'] + Alpha;
> >
> > type
> >   TTable = record
> >     Name, UpStringName : string;
> >   end;
> >
> >   TMySQLDB = class(TForm)
> >     procedure MySQLDBCREATE(Sender: TObject);
> >   private
> >     { private declarations }
> >     Connected : boolean;
> >     ErrorCode, RowCount, ColCount, TableCount : integer;
> >     SQL : PMYSQL;
> >     QMySQL : TMYSQL;
> >     recbuf : PMYSQL_RES;
> >     rowbuf : TMYSQL_ROW;
> >     Daten : array[0..MaxSpalten, 0..MaxZeilen] of string;
> >     Table : array[0..MaxTables] of TTable;
> >   public
> >     { public declarations }
> >     function Tabellenindex(Tabellenname : string) : integer;
> >     procedure KorrigiereTabellennamen(var Anfrage : string);
> >     function Connect(MySQLUser, MySQLPasswort, MySQLDatenbank,
> > MySQLHost : string; MySQLPort : integer) : boolean;
> >     procedure Disconnect;
> >     function GetQuery(Anfrage : string; var Zeilenzahl, Spaltenzahl
> >
> > : integer) : integer;
> >
> >     function SetQuery(Anfrage : string) : integer;
> >     procedure LiesElement(Zeile, Spalte : integer; var Wert :
> > string);
> >   end;
> >
> > var
> >   MySQLDB: TMySQLDB;
> >
> > implementation
> >
> > uses
> >     LowLevelProcs;
> >
> > function TMySQLDB.Tabellenindex(Tabellenname : string) : integer;
> > var
> >    n : integer;
> > begin
> >      if Tabellenname <> '' then begin
> >         for n := 0 to TableCount-1 do begin
> >             if Tabellenname = Table[n].UpStringName then begin
> >                Tabellenindex := n;
> >                exit;
> >             end;
> >          end;
> >      end;
> >      Tabellenindex := -1;
> > end;
> >
> > procedure TMySQLDB.KorrigiereTabellennamen(var Anfrage : string);
> > var
> >    i, n, m, Wortstart : integer;
> >    s : string;
> > begin
> >      n := 0;
> >      while n < Length(Anfrage) do begin
> >            while (n <= Length(Anfrage)) and not (Anfrage[n] in
> > Alpha) do begin
> >                  if Anfrage[n] = '"' then begin
> >                     inc(n);
> >                     while (n <= Length(Anfrage)) and (Anfrage[n] <>
> > '"') do begin
> >                           inc(n);
> >                     end;
> >                  end;
> >                  inc(n);
> >            end;
> >            s := '';
> >            Wortstart := n;
> >            while (n <= Length(Anfrage)) and (Anfrage[n] in
> > AlphaNumeric) do begin
> >                  s := s + UpCase(Anfrage[n]);
> >                  inc(n);
> >            end;
> >            m := Tabellenindex(s);
> >            if m >= 0 then begin
> >               delete(Anfrage, Wortstart, Length(s));
> >               system.insert(Table[m].Name, Anfrage, Wortstart);
> >               n := Wortstart + Length(Table[m].Name);
> >            end;
> >      end;
> > end;
> >
> > function TMySQLDB.Connect(MySQLUser, MySQLPasswort, MySQLDatenbank,
> > MySQLHost : string; MySQLPort : integer) : boolean;
> > var
> >    Zeilenzahl, Spaltenzahl : integer;
> >    s : string;
> > begin
> >      if Connected then begin
> >         Disconnect;
> >      end;
> >      mysql_port := MySQLPort;
> >      SQL := mysql_connect(@QMySQL, PChar(MySQLHost),
> > PChar(MySQLUser), PChar(MySQLPasswort));
> >      if SQL = nil then  begin
> >         ShowMessage('Verbindung zum MySQL-Server ist
> > fehlgeschlagen! '+mysql_error(@QMySQL));
> >         exit;
> >      end;
> >      if mysql_select_db(SQL, PChar(MySQLDatenbank)) < 0 then begin
> >         ShowMessage('Konnte die Datenbank '+MySQLDatenbank+' nicht
> > aktivieren! '+mysql_error(SQL));
> >         exit;
> >      end;
> >      Connected := true;
> >      TableCount := 0;
> >      if GetQuery('SHOW Tables', Zeilenzahl, Spaltenzahl) = 0 then
> > begin
> >         while TableCount < Zeilenzahl do begin
> >               LiesElement(TableCount, 0, s);
> >               Table[TableCount].Name := copy(s, 1, Length(s));
> >               Table[TableCount].UpStringName :=
> > string(StrUpper(PChar(s)));
> >               inc(TableCount);
> >         end;
> >      end;
> >      Connect := Connected;
> > end;
> >
> > procedure TMySQLDB.Disconnect;
> > begin
> >      if not Connected then begin
> >         exit;
> >      end;
> >      mysql_close(SQL);
> >      Connected := false;
> > end;
> >
> > function TMySQLDB.GetQuery(Anfrage : string; var Zeilenzahl,
> > Spaltenzahl : integer) : integer;
> > var
> >    x, y : integer;
> > begin
> >      if not Connected then begin
> >         exit;
> >      end;
> >      ErrorCode := 0;
> >      RowCount := 0;
> >      ColCount := 0;
> >      Zeilenzahl := 0;
> >      Spaltenzahl := 0;
> >      KorrigiereTabellennamen(Anfrage);
> >      if mysql_query(SQL, PChar(Anfrage)) < 0 then begin
> >         ShowMessage('Fehler bei der Anfrage "'+Anfrage+'"!
> > '+mysql_error(SQL));
> >         exit;
> >      end;
> >      recbuf := mysql_store_result(SQL);
> >      Zeilenzahl := mysql_num_rows(recbuf);
> >      Spaltenzahl := mysql_num_fields(recbuf);
> >      RowCount := Zeilenzahl;
> >      ColCount := Spaltenzahl;
> >      rowbuf := mysql_fetch_row(recbuf);
> >      for y := 0 to Zeilenzahl-1 do begin
> >          if y < MaxZeilen then begin
> >             for x := 0 to Spaltenzahl-1 do begin
> >                 if x < MaxSpalten then begin
> >                    Daten[x, y] := rowbuf[x];
> >                 end;
> >             end;
> >          end;
> >          rowbuf := mysql_fetch_row(recbuf);
> >      end;
> >      if Zeilenzahl > MaxZeilen then begin
> >         MessageDlg('Konnte nur '+IntToStr(MaxZeilen)+' von
> > '+IntToStr(Zeilenzahl)+' einlesen, da zu wenig Speicherplatz
> > vorgesehen ist.', mtError, [mbOk], 0);
> >      end;
> >      if Spaltenzahl > MaxSpalten then begin
> >         MessageDlg('Konnte nur '+IntToStr(MaxSpalten)+' von
> > '+IntToStr(Spaltenzahl)+' einlesen, da zu wenig Speicherplatz
> > vorgesehen ist.', mtError, [mbOk], 0);
> >      end;
> >      mysql_free_result (recbuf);
> >      GetQuery := ErrorCode;
> > end;
>
> === message truncated ===> object MySQLDB: TMySQLDB
>
> >   CAPTION = 'Schnittstelle zu MySQL'
> >   CLIENTHEIGHT = 300
> >   CLIENTWIDTH = 400
> >   ONCREATE = MySQLDBCREATE
> >   HORZSCROLLBAR.PAGE = 401
> >   VERTSCROLLBAR.PAGE = 301
> >   LEFT = 290
> >   HEIGHT = 300
> >   TOP = 176
> >   WIDTH = 400
> > end
>
> Hi, I would like to test this, can you pack the project so I can open
> with lazarus?. Thanks.
>
> About dataset components, some days ago I released in this list an
> archive with some test work about TDBGrid + TDataSource + Demo using
> TDataSet derivatives as TIBQuery and TMySQLDataset. Some changes in
> fcl/db must be done to get TDataSource working, but i put all files
> in one directory so is not necesary to modify  original files (only
> grids.pas [included] which need to go temporally to lcl directory)
> here is the link again:
> http://mx.geocities.com/jesusrmx/lazarus/dbgrid.tar.gz
>
> Regards.
>
> Jesus Reyes A.
>
> _________________________________________________________
> Do You Yahoo!?
> La mejor conexión a internet y 25MB extra a tu correo por $100 al mes.
> http://net.yahoo.com.mx
>
> _________________________________________________________________
>      To unsubscribe: mail lazarus-request at miraclec.com with
>                 "unsubscribe" as the Subject
>    archives at http://www.lazarus.freepascal.org/mailarchives






More information about the Lazarus mailing list