Win7, OnBeforePost und DevExpress Grid 6.53

November 16, 2010 - Lesezeit: ~1 Minute

In der Version 6.53 existiert ein Designfehler im cxGrid, wenn in der Event OnBeforePost eine Messagebox aufgerufen wird

 

procedure TForm1.dxMemData1BeforePost(DataSet: TDataSet);
begin
  if MessageDlg('save record?', mtConfirmation,mbYesNo,0) <> mrYes then
    Abort;
end;

 

Der Dialog sollte eigentlich so aussehen:

Ansicht Fehler

 

Durch den Fehler sieht es aber so aus:

Ansicht ok

 

 

Als Workaround wurde mir von DevExpress folgendes empfohlen:

 

procedure TForm1.dxMemData1BeforePost(DataSet: TDataSet);
begin
  cxGrid1.Perform(WM_SETREDRAW, Integer(false), 0);
  try
    if MessageDlg('save record?', mtConfirmation, mbYesNo, 0) <> mrYes then
      Abort;
  finally
    cxGrid1.Perform(WM_SETREDRAW, Integer(true), 0);
  end;
end;
Tags: Delphi Delphi 2009 DevGrid

Delphi 2009: Download einer Datei

September 20, 2010 - Lesezeit: ~1 Minute

Download einer Datei mit der TDownLoadURL - Action. Da diese Komponente DLL's des IE nutzt, braucht der Entwickler keine weiteren Einstellungen (Proxy ...) vorsehen.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls,
  ExtActns;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure Progress(Sender: TDownLoadURL; Progress, ProgressMax: Cardinal; StatusCode: TURLDownloadStatus; StatusText: string; var Cancel: Boolean);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TDownLoadURL.Create(nil) do
  try
    URL := 'http://../test.txt';      // URL der Datei
    Filename := '...\test.txt';       // Name der Datei
    OnDownloadProgress := Progress;   // Status des Downloads anzeigen
    Execute;
  finally
    Free;
  end;
end;

procedure TForm1.Progress(Sender: TDownLoadURL; Progress, ProgressMax: Cardinal; StatusCode: TURLDownloadStatus;
  StatusText: string; var Cancel: Boolean);
begin
  ProgressBar1.Max:=ProgressMax;
  ProgressBar1.Position:=Progress;
  Caption:=StatusText;
end;

end.
Tags: Delphi Delphi 2009

Variablen vom Typ Record in einer dynamischen Liste verwalten

August 6, 2010 - Lesezeit: ~1 Minute
unit MerkRecord;

interface

uses Classes,Variants;

type
  // Dieser Rekord soll in der Liste enthalten sein
  TMerkRecord = Record
    I :integer;
    s :string;
    v : Variant;
    a :array of char;
  End;

  // die eigentliche Liste
  TMerkList = class(TList)
  private
    function GetItems(index: integer): TMerkRecord;
  protected
    // Freigabe des Speichers
    procedure Notify(Ptr: Pointer; Action: TListNotification); override;
  public
    // Zugriff auf den Rekord
    property Items[index :integer] :TMerkRecord read GetItems; default;
    // Neuen Record hinzufügen
    function Add(R :TMerkRecord) :integer;
  end;

implementation

type
  PMerkRecord = ^TMerkrecord;

{ TMerkList }

function TMerkList.Add(R: TMerkRecord): integer;
var
  P :PMerkRecord;
begin
  P:= new(PMerkRecord);
  P^:=R;
  Result:=inherited Add(P);
end;

function TMerkList.GetItems(index: integer): TMerkRecord;
begin
 Result:=PMerkRecord(inherited Items[Index])^;
end;

{Strings und dynamische Arrays müssen auf die Länge von 0 gesetzt werden.
 Da Variants alle Typen enthalten können, müssen sie auf NULL gesetzt werden}

procedure TMerkList.Notify(Ptr: Pointer; Action: TListNotification);
begin
  if Action=lnDeleted then begin
    PMerkRecord(Ptr).s:='';
    PMerkRecord(Ptr).V:=Null;
    SetLength(PMerkRecord(Ptr).a,0);
    Dispose(Ptr);
  end;
  inherited;
end;

end.
Tags: Delphi Delphi 2009

DevGrid 6: nur Jahre in Filterbox

Juli 21, 2010 - Lesezeit: ~1 Minute

Beim Filtern einer Column mit Datumswerten sollen nur die Jahre angezeigt werden

Filter aktiv

Dadurch ist auch eine Mehrfachauswahl möglich. dafür sind 2 Schritte notwendig: Es müssen die Events OnGetFilterValues und OnInitFilteringDateRanges genutzt werden


procedure THWFilter.OnInitFilteringDateRanges(Sender: TcxCustomGridTableItem; ADateRanges: TcxGridDateRanges);
begin
  ADateRanges.Add(TcxGridYearRange); // nach Jahren filtern
end;

procedure THWFilter.OnGetFilterValues(Sender: TcxCustomGridTableItem; AValueList: TcxDataFilterValueList);
var
  z: integer;
begin
  // löschen der einzelnen Tage
  for z := AValueList.Count - 1 downto 0 do
    if AValueList[z].Kind = fviValue then
      AValueList.Delete(z);
end;
Tags: Delphi Delphi 2009 DevGrid

Windows XP ausschalten funktioniert nicht (nach der Benutzung von Delphi 2009)

Juni 5, 2009 - Lesezeit: ~1 Minute

Nach der Benutzung der Hilfe von Delphi 2009 lässt sich Windows XP nicht mehr beenden. Schuld daran ist der Prozess

  dexplorer      (Windows Hilfe)

Wenn dieser beendet wird, kann Windows wieder richtig beendet werden.

Tags: Windows Delphi Delphi 2009

Collection-Property

Dezember 2, 2008 - Lesezeit: 3 Minuten

eine Collection-Property mit Editor erstellen, ohne das diese im Objektinspektor sichtbar ist...


Property public definieren

  public
property SeriesList: TCollection read FSeriesList write SetSeriesList;
end;

Property für Speichern/Laden anmelden

  private
procedure ReadSeries(Reader: TReader);
procedure WriteSeries(Writer: TWriter);
protected
procedure DefineProperties(Filer: TFiler); override;
...
procedure TdspExtChart.ReadSeries(Reader: TReader);
begin
SeriesList.Clear;
Reader.ReadValue;
Reader.ReadCollection(SeriesList);
end;

procedure TdspExtChart.WriteSeries(Writer: TWriter);
begin
Writer.WriteCollection(FSeriesList);
end;

procedure TdspExtChart.DefineProperties(Filer: TFiler);
begin
inherited;
Filer.DefineProperty('SeriesList', ReadSeries, WriteSeries, True);
end;
 

Editor für die Eigenschaft erstellen

uses Classes,dspChart,DesignEditors,DesignIntf,ColnEdit;
// Package designide70 für ColnEdit einfügen !!!

type
TDspChartEditor = class(TComponentEditor)
public
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
end;

procedure Register;
begin
RegisterComponents('Dsp', [TdspExtChart]);
RegisterComponentEditor(TdspExtChart,TDspChartEditor);
end;

{ TDspChartEditor }
procedure TDspChartEditor.ExecuteVerb(Index: Integer);
begin
if Index=0 then
ShowCollectionEditor(Designer, Component,
(Component as TdspExtChart).SeriesList, 'SerienList')
else
inherited ExecuteVerb(Index-1);
end;

function TDspChartEditor.GetVerb(Index: Integer): string;
begin
if Index=0 then
Result:='Serien bearbeiten'
else
Result:=inherited GetVerb(Index-1);
end;

function TDspChartEditor.GetVerbCount: Integer;
begin
Result:= inherited GetVerbCount+1;
end;

verbesserte Routine zum Speichern, das in der Vererbung von Formularen gleiche Property's nur einmal gespeichert werden

 
procedure TdspExtChart.DefineProperties(Filer: TFiler);
var
StoreIt: boolean;
Chart2: TdspExtChart;
begin
inherited;
Chart2 := Filer.Ancestor as TdspExtChart;
if Chart2 = nil then // keine Vererbung
StoreIt := true // immer Speichern
else // Coll. vergleichen
StoreIt := not CollectionsEqual(
FSeriesList, Chart2.FSeriesList, self, Chart2);
Filer.DefineProperty('SeriesList', ReadSeries, WriteSeries, StoreIt);
end;
Tags: Delphi