Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus / 2003-02

MySQL and Lazarus.

6 messages · 4 people ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

HSO

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).

Reply by email

Jesus Reyes
to Rainer Hamann: I've a very small component called TMySQLDB, which encapsulates mysql.pas, which is part…

--- Rainer Hamann escribi�: > I've a very
small component called TMySQLDB, which encapsulates

Show quoted text 226 lines
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 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;
Show quoted text 201 lines
{$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

Show quoted text 12 lines
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

Reply by email

Rainer Hamann
to HSO: There ins`t database components for lazarus as is in delphi? Where can i find some…

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

Show quoted text 10 lines
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 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;
        with ColEditor[eCol] as TComboBox do begin
             if Text  '' then begin
                exists := false;
                for n := 0 to Items.Count-1 do begin
                    if pos(Text, Items[n]) = 1 then begin
                       exists := true;
                       break;
                    end;
                end;
                if not exists then begin
                   Text := copy(Text, 1, Length(Text)-1);
                   Application.ProcessMessages;
                   beep;
                end;
                if OnEditorChange  nil then begin
                   OnEditorChange(Text, eCol, eRow);
                end;
             end;
          end;
     end;
end;
procedure TDataGrid.ComboBoxKeyDown(Sender : TObject; var Key: Word; Shift: TShiftState);
begin
     if Key = VK_RETURN then begin
        with Sender as TComboBox do begin
             Cells[eCol, eRow] := Text;
             ChangeCellSelected(Text);
             Hide;
        end;
        KeyDown(Key, Shift);
        Key := 0;
     end;
end;
procedure TDataGrid.CopyEditType(FromCol, ToCol : integer);
begin
     ColEditor[ToCol] := ColEditor[FromCol];
     ColEditorType[ToCol] := ColEditorType[FromCol];
     ColEditorIsCopy[ToCol] := true;
end;
procedure TDataGrid.DateClick(Sender : TObject);
var
   d : string;
begin
     with ColEditor[eCol] as TDatePicker do begin
          d := Calendar.Date;
          while pos('-', d) > 0 do begin
                d[pos('-', d)] := '.';
          end;
          ChangeCellSelected(d);
          Hide;
     end;
end;
procedure TDataGrid.EditExit;
var
   NewCol, NewRow : integer;
   ok : boolean;
begin
     EditorToCell(eCol, eRow, NewCol, NewRow, ok);
     eCol := -1;
     eRow := -1;
end;
procedure TDataGrid.EditKeyDown(Sender : TObject; var Key: Word; Shift: TShiftState);
begin
     if Key = VK_RETURN then begin
        with Sender as TEdit do begin
             Cells[eCol, eRow] := Text;
             ChangeCellSelected(AnsiToWin(Text));
             Hide;
        end;
        KeyDown(Key, Shift);
        Key := 0;
     end;
end;
procedure TDataGrid.EditorToCell(OldCol, OldRow : integer; var NewCol, NewRow : integer; var ok : boolean);
var
   n : integer;
begin
     ok := true;
     if (OldCol >= 0) and (ColEditor[OldCol]  nil) then begin
        case ColEditorType[OldCol] of
             dgEdit :
                begin
                   with ColEditor[OldCol] as TEdit do begin
                        ChangeCellSelected(AnsiToWin(Text));
                        Hide;
                   end;
                end;
             dgComboBox :
                begin
                   with ColEditor[OldCol] as TComboBox do begin
                        ok := false;
                        if Text  '' then begin
                           for n := 0 to Items.Count-1 do begin                // workaround, no OnChange event !!!
                               if Items[n] = Text then begin
                                  ok := true;
                                  break;
                               end;
                           end;
                        end;
                        if ok or (Text = '') then begin
                           ChangeCellSelected(Text);
                           Hide;
                        end
                        else begin
                           MessageDlg(Text+' ist nicht erlaubt!', mtError, [mbOk], 0);
                           NewCol := OldCol;    // once again!
                           NewRow := OldRow;
                        end;
                   end;
                end;
        end;
     end;
end;
function TDataGrid.GetDBIndex(DBCol, DBRow: Integer): string;
var
   i : ^integer;
begin
     i := FDBIndex.Arr[DBCol, DBRow];
     if i  nil then begin
        if i^ > 0 then begin
           GetDBIndex := IntToStr(i^);
        end
        else begin
           GetDBIndex := '';
        end;
     end
     else begin
        GetDBIndex := '';
     end;
end;
procedure TDataGrid.KeyDown(var Key: Word; Shift: TShiftState);
var
   n, dx, dy : integer;
begin
     if Key = VK_RETURN then begin
        case OkDirection of
             okRight :
                begin
                     n := eColLast + 1;
                     dx := 1;
                     dy := 0;
                     while (n < ColCount-1) and (ColEditor[n] = nil) do begin
                           inc(n);
                           inc(dx);
                     end;
                     if (n >= ColCount-1) and (ColEditor[n] = nil) then begin
                        n := 0;
                        dx := -eColLast;
                        inc(dy);
                        while (n < ColCount-1) and (ColEditor[n] = nil) do begin
                              inc(n);
                              inc(dx);
                        end;
                     end;
                     MoveExtend(true, dx, dy);
                end;
             okDown :
                begin
                     if eRowLast < RowCount-1 then begin
                        MoveExtend(true, 0, 1);
                     end
                     else begin
                        MoveExtend(false, FixedCols, eColLast);
                     end;
                end;
        end;
     end;
end;
procedure TDataGrid.SelectCell(ColNr, RowNr : integer);
begin
     MoveExtend(false, ColNr, RowNr);
end;
procedure TDataGrid.SelectEditType(ColNr : integer; EditType : TColEditor);
begin
     if ColEditor[ColNr]  nil then begin
        ColEditor[ColNr].Free;
     end;
     case EditType of
          dgEdit :
             begin
                ColEditor[ColNr] := TEdit.Create(self);
                with ColEditor[ColNr] as TEdit do begin
                   OnKeyDown := @EditKeyDown;
                end;
             end;
          dgComboBox :
             begin
                ColEditor[ColNr] := TComboBox.Create(self);
                with ColEditor[ColNr] as TComboBox do begin
                   OnKeyPress := @ComboBoxChange;
                   OnKeyDown := @ComboBoxKeyDown;
                   Style := csDropDownList;
                end;
             end;
          dgDate :
             begin
                ColEditor[ColNr] := TDatePicker.Create(self);
                with ColEditor[ColNr] as TDatePicker do begin
                   Ok.OnClick := @DateClick;
                end;
             end;
     end;
     if ColEditor[ColNr]  nil then begin
        ColEditorType[ColNr] := EditType;
        ColEditor[ColNr].Text := '';
        ColEditor[ColNr].Parent := self;
        ColEditor[ColNr].Visible := false;
        ColEditorIsCopy[ColNr] := false;
     end;
end;
procedure TDataGrid.Selection(Sender: TObject; ColNr, RowNr : integer);
var
   r : TRect;
   s : string;
   ok : boolean;
begin
//     ShowMessage(IntToStr(eCol)+' | '+IntToStr(eRow)+' -> '+IntToStr(ColNR)+' | '+IntToStr(RowNr));
     if (ColNr  eCol) or (RowNr  eRow) then begin     // force something like "OnExit"
        EditorToCell(eCol, eRow, ColNr, RowNr, ok);
        Application.ProcessMessages;
        if (eCol < 0) or (eRow < 0) then begin        // new Cell selected
           if OnCellEnter  nil then begin
              OnCellEnter(ColNr, RowNr);
           end;
           if ColEditor[ColNr]  nil then begin
               case ColEditorType[ColNr] of
                    dgEdit :
                       begin
                          with ColEditor[ColNr] as TEdit do begin
                               Text := WinToAnsi(Cells[ColNr, RowNr]);
                          end;
                       end;
                    dgComboBox :
                       begin
                          with ColEditor[ColNr] as TComboBox do begin
                               Text := Cells[ColNr, RowNr];
                          end;
                       end;
                    dgDate :
                       begin
                          s := Cells[ColNr, RowNr];
                          if s = '' then begin
                             s := DateToStr(Date);
                          end;
                          while pos('.', s) > 0 do begin
                             s[pos('.', s)] := '-';
                          end;
                          with ColEditor[ColNr] as TDatePicker do begin
                             Calendar.Date := s;
                          end;
                       end;
               end;
           end;
        end;
        r := CellRect(ColNr, RowNr);
        if ColEditor[ColNr]  nil then begin
            ColEditor[ColNr].Top := r.Top;
            ColEditor[ColNr].Left := r.Left;
            if ColEditorType[ColNr]  dgDate then begin
               ColEditor[ColNr].Height := r.Bottom - r.Top;
               ColEditor[ColNr].Width := r.Right - r.Left;
               LastEditText := ColEditor[ColNr].Text;
            end;
            ColEditor[ColNr].Show;
        end;
        eCol := ColNr;
        eRow := RowNr;
        if ColEditor[ColNr]  nil then begin
           Timer.Enabled := true;
           TimerFirst := true;
        end;
        Application.ProcessMessages;
        if not ok then begin
           SelectCell(ColNr, RowNr);
        end;
     end;
end;
procedure TDataGrid.SetDBIndex(DBCol, DBRow: Integer; const AValue: string);
var
   i : ^integer;
begin
     if FDBIndex.Arr[DBCol, DBRow]  nil then begin
        i := FDBIndex.Arr[DBCol, DBRow];
        FreeMem(i);
     end;
     GetMem(i, sizeof(i));
     FDBIndex.Arr[DBCol, DBRow] := i;
     if AValue  '' then begin
        i^ := StrToInt(AValue);
     end
     else begin
        i^ := -1;
     end;
end;
procedure TDataGrid.TimerEvent(Sender : TObject);
var
   Key : char;
begin
     Timer.Enabled := false;
     if ColEditor[eCol]  nil then begin
        if TimerFirst then begin
           ColEditor[eCol].SetFocus;
           TimerFirst := false;
        end;
        if ColEditorType[eCol]  dgDate then begin
           if LastEditText  ColEditor[eCol].Text then begin
              LastEditText := ColEditor[eCol].Text;
              case ColEditorType[eCol] of
                   dgComboBox :
                      begin
                           Key := #0;
                           ComboBoxChange(Sender, Key);
                      end;
              end;
           end;
        end;
     end;
     Timer.Enabled := true;
end;
procedure TDataGrid.TopLeftChanged(Sender : TObject);
var
   r : TRect;
   n, eTop, eLeft : integer;
begin
     if IsTopLeftChange then begin
        exit;
     end;
     IsTopLeftChange := true;
     inherited OnTopLeftChange(Sender);
     if (eCol >= 0) and (eRow >= 0) then begin
        r := CellRect(eCol, eRow);
        eLeft := 0;
        for n := 0 to FixedCols-1 do begin
            inc(eLeft, ColWidths[n]);
        end;
        eTop := 0;
        for n := 0 to FixedRows-1 do begin
            inc(eTop, RowHeights[n]);
        end;
        if ColEditor[eCol]  nil then begin
           if (eLeft <= r.Left) and (eTop <= r.Top) and (r.Top < Height) and (r.Left < Width) then begin
              ColEditor[eCol].Top := r.Top;
              ColEditor[eCol].Left := r.Left;
              if ColEditorType[eCol]  dgDate then begin
                 ColEditor[eCol].Height := r.Bottom - r.Top;
                 ColEditor[eCol].Width := r.Right - r.Left;
              end;
              ColEditor[eCol].Show;
           end
           else begin
              ColEditor[eCol].Hide;
           end;
        end;
    end;
    IsTopLeftChange := false;
end;
end.
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;
function TMySQLDB.SetQuery(Anfrage : string) : integer;
begin
     if not Connected then begin
        exit;
     end;
     ErrorCode := 0;
     KorrigiereTabellennamen(Anfrage);
     if mysql_query(SQL, PChar(Anfrage)) < 0 then begin
        ShowMessage('Fehler bei der Anfrage "'+Anfrage+'"! '+mysql_error(SQL));
     end;
     SetQuery := ErrorCode;
end;
procedure TMySQLDB.LiesElement(Zeile, Spalte : integer; var Wert : string);
begin
     if not Connected then begin
        Wert := '';
        exit;
     end;
     if (Zeile < RowCount) and (Spalte < ColCount) and (ErrorCode = 0) then begin
        Wert := Daten[Spalte, Zeile];
     end
     else begin
        Wert := '';
     end;
end;
procedure TMySQLDB.MySQLDBCREATE(Sender: TObject);
begin
     SQL := nil;
     Connected := false;
end;
initialization
  {$I fmysqldb.lrs}
end.

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

Reply by email

Rainer Hamann
to Jesus Reyes: --- Rainer Hamann escribi�: > I've a very small component called TMySQLDB, which…

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

Show quoted text 477 lines
--- Rainer Hamann 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 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 with "unsubscribe" as the Subject archives at http://www.lazarus.freepascal.org/mailarchives

Reply by email

Jesus Reyes
to Unknown author: I've downloaded it and studied it a bit. I've noticed you changed the buffer handling;…
Show quoted text 12 lines
I've downloaded it and studied it a bit. I've noticed you changed the buffer handling; This is good, I needed to do this anyway, sometimes there was a crash in the old mechanism, and I never understood why. Do the TDataset/TDatasource work correctly now ? if yes, I will use your changes in the FCL if this is OK with you ? Michael.

TdataSource/TDataSet is working fine (look the demo a test any button combination) but several things are untested, for example What would happen if the user resize the a grid control and this change the active record, what should happen to the others controls, ... I think provisions for things like that are needed but still not included, Editing behavior, .. etc.

If you like you can add the changes to the FCL. Maybe the TComponentDatalink is a good candidate to the FCL too.

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

Reply by email

Unknown author
to Jesus Reyes: --- Rainer Hamann escribi�: > I've a very small component called TMySQLDB, which…
Show quoted text 12 lines
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

I've downloaded it and studied it a bit. I've noticed you changed the buffer handling; This is good, I needed to do this anyway, sometimes there was a crash in the old mechanism, and I never understood why.

Do the TDataset/TDatasource work correctly now ? if yes, I will use your changes in the FCL if this is OK with you ?

Michael.

Reply by email