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:

Durch den Fehler sieht es aber so aus:

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
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
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
Beim Filtern einer Column mit Datumswerten sollen nur die Jahre angezeigt werden

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
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 2009eine Collection-Property mit Editor erstellen, ohne das diese im Objektinspektor sichtbar ist...
public
property SeriesList: TCollection read FSeriesList write SetSeriesList;
end;
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;
// 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;
procedure TdspExtChart.DefineProperties(Filer: TFiler);Tags: Delphi
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;