Einzelnen Beitrag anzeigen

Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: Hat Jemand eine Ahnung wie ich diese Datei in ein Stringgrid bekomme.

  Alt 1. Apr 2018, 23:08
[EDIT]
Diesen Code nicht benutzen da er anscheinend schlecht ist. Tut mir leid.
[/EDIT]

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, DBTables, Db;

const
  WM_OPENDATASET = WM_USER + 1;
  WM_EXECUTESQL = WM_USER + 2;

type
  TThreadDataSet = class(TThread)
  private
    procedure WMOpenDataSet(Msg: TMsg);
    procedure WMExecSQL(Msg: TMsg);
  protected
    procedure Execute; override;
  public
    procedure Open(DataSet: TDataSet);
    procedure ExecSQL(DataSet: TDataSet);
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FThread : TThreadDataSet;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TThreadDataSet.ExecSQL(DataSet: TDataSet);
begin
  PostThreadMessage(ThreadID, WM_EXECUTESQL, Integer(DataSet), 0);
end;

procedure TThreadDataSet.Execute;
var
  Msg : TMsg;

begin
  FreeOnTerminate := True;
  PeekMessage(Msg, 0, WM_USER, WM_USER, PM_NOREMOVE);

  while not Terminated do begin
    if GetMessage(Msg, 0, 0, 0) then
       case Msg.Message of
         WM_OPENDATASET: WMOpenDataSet(Msg);
         WM_EXECUTESQL: WMExecSQL(Msg);
       end;
  end;
end;

procedure TThreadDataSet.Open(DataSet: TDataSet);
begin
  PostThreadMessage(ThreadID, WM_OPENDATASET, Integer(DataSet), 0);
end;

procedure TThreadDataSet.WMExecSQL(Msg: TMsg);
var
  Qry : TQuery;

begin
  try
    Qry := TQuery(Msg.wParam);
    try
      Qry.Open;
    except
      Qry.ExecSQL;
    end;
  except
    On E: Exception do
       ShowMessage(E.Message);
  end;
end;

procedure TThreadDataSet.WMOpenDataSet(Msg: TMsg);
var
  Ds : TDataSet;

begin
  try
    Ds := TDataSet(Msg.wParam);
    Ds.Open;
  except
    On E: Exception do
       ShowMessage(E.Message);
  end;
end;

// MAIN PART

procedure TForm1.FormCreate(Sender: TObject);
begin
  FThread := TThreadDataSet.Create(False);
  FThread.Open(Table1); // Öffne ein DataSet (table oder query)
  FThread.ExecSQL(Query1); // Execute die SQL
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FThread.Terminate;
end;

end.
So könnte die ClientDataSet-Variante umgesetzt werden, in diesem Beispiel-Code gleich Threaded.
Um damit Sinnvoll umzugehen die Hilfe-Datei lesen.
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 2. Apr 2018 um 11:27 Uhr)
  Mit Zitat antworten Zitat