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;