Hi,
Da ihr es ja alle nicht fertig gebracht habt, habe ich mir mal selbst geholfen und ein Besispiel gemacht:
Ich habe ein Problem mit dem folgendem Code den "ich selber" geschrieben habe (Save_DIP und Restore_DIP):
function GetDesktopListViewHandle: THandle;
var
S: String;
begin
Result := FindWindow('ProgMan', nil);
Result := GetWindow(Result, GW_CHILD);
Result := GetWindow(Result, GW_CHILD);
SetLength(S, 40);
GetClassName(Result, PChar(S), 39);
if PChar(S) <> 'SysListView32' then Result := 0;
end;
procedure Save_DIP(wnd: HWND; AFile: string);
var
cItems : Integer;
DIPFile : array[0..MAX_PATH] of DIP;
F : File of DIP;
iLoop : Integer;
LVItem : TLVItem;
aIText : array[0..MAX_PATH]of Char;
ptIPos : TPoint;
begin
{ Variablen initalisieren }
ZeroMemory(@cItems, SizeOf(cItems)); // Item-Anzahl
ZeroMemory(@DIPFile, SizeOf(DIPFile)); // Array of DIP-typ
ZeroMemory(@aIText, SizeOf(AIText)); // CallBack BufferText
ZeroMemory(@ptIPos, SizeOf(ptIPos)); // ItemPos
{ Dateihandle erzeugen }
AssignFile(F, AFile);
{ Datei neu erzeugen }
ReWrite(F);
{ Anzahl der Symbole herausbekommen }
cItems := SendMessage(wnd, LVM_GETITEMCOUNT, 0, 0);
{ Anzahl der Wiederholungen auf null stellen }
iLoop := 0;
{ in einer whileshleife die ganzen items durchgehen }
while iLoop < cItems do
begin
{ Alle Blöcke der Variable LVItem mit nullen (leeren) füllen }
ZeroMemory(@LVItem, SizeOf(LVItem));
{ Textbuffer zuweisen }
LVItem.pszText := @aIText[0];
{ Maximale Textlänge angeben }
LVItem.cchTextMax := MAX_PATH;
{ Itemtext lesen }
SendMessage(wnd, LVM_GETITEMTEXT, iLoop, LongInt(@LVItem));
{ Itemposition lesen }
SendMessage(wnd, LVM_GETITEMPOSITION, iLoop, LongInt(@ptIPos));
{ DIP-Typ mit Daten füllen }
DIPFile[iLoop].ItemName:=LVItem.pszText;
DIPFile[iLoop].ItemPos:=ptIPos;
{ Daten in die Datei schreiben }
Write(F, DIPFile[iLoop]);
{ Anzahl der Wiederholungen erhöhen }
Inc(iLoop);
end;
{ Dateihandle schließen }
CloseFile(F);
end;
procedure Restore_DIP(wnd: HWND; AFile: string);
var
DIPFile : array[0..MAX_PATH] of DIP;
F : File of DIP;
iStyle : Integer;
iLoop : DWORD;
avName : string;
ptIPos : TPoint;
fIndex : Integer;
LVInfo : TLVFindInfo;
begin
{ Variablen initalisieren }
ZeroMemory(@iLoop, SizeOf(iLoop)); // Anzahl der wiederholungen
ZeroMemory(@LVInfo, SizeOf(LVInfo)); // Suchinformationen
ZeroMemory(@ptIPos, SizeOf(ptIPos)); // ItemPos
ZeroMemory(@DIPFile, SizeOf(DIPFile)); // Array of DIP-typ
ZeroMemory(@iStyle, SizeOf(iStyle)); // Desktop-Style
{ Dateihandle erzeugen }
AssignFile(F, AFile);
{ Datei öffnen }
{$I+} Reset(F); {$I-}
if IOResult=NO_ERROR then
begin
{ DosktopStyle abfragen (ob items automatisch angeordnet ... ) }
iStyle:=GetWindowLong(wnd, GWL_STYLE);
if (iStyle and LVS_AUTOARRANGE) <> 0 then
begin
{ wenn ja das die automatische anordnung der items ausschalten }
SetWindowLong(wnd, GWL_STYLE, iStyle and not LVS_AUTOARRANGE);
end;
{ Datei nach items abfragen }
while not Eof(F) do
begin
{ Einen DIP-Block aus der Datei lesen }
read(F, DIPFile[iLoop]);
{ Suchinformationen leeren }
ZeroMemory(@LVInfo, DWORD(SizeOf(LVInfo)));
{ Itemtext in Variable zwischenspeichern }
avName:=DIPFile[iLoop].ItemName;
{ Position übergeben }
ptIPos:=DIPFile[iLoop].ItemPos;
{ Sagen das er nach dem Item Text suchen soll }
LVInfo.flags:=LVFI_STRING;
{ ItemText übergeben }
LVInfo.psz:=PChar(avName);
fIndex := SendMessage(wnd, LVM_FINDITEM, -1, LongInt(@LVInfo));
if fIndex <> -1 then
SendMessage(wnd, LVM_SETITEMPOSITION, fIndex, MakeLong(ptIPos.x, ptIPos.y)); // MakeLong(ptIPos.x, ptIPos.y) bedeutet: ptIPos.x or (ptIPos.y shl 16)
{ Nach iStyle anordnen, geht auch ohne }
SetWindowLong(wnd, GWL_STYLE, iStyle);
{ Anzahl der Wiederholungen erhöhen }
Inc(iLoop);
end;
{ Dateihandle schließen }
CloseFile(F);
end;
end;
Wenn ich der Function Save_DIP das Handle vom DesktopListView übergebe dann bekomme ich immer ein Fehler bei "LVM_GETITEMTEXT".
Nachdem er das ausgefürt hat geht es weiter aber ohne das ich den Text des Symboles habe !!!
Aber das beste ist ja: Wenn ich eine neues Prokekt erzeuge und darin ein TListView plaziere und ein paar Items reinschmeise und dann das Handle meines ListView's übergebe dann geht`s !!! das kann ja wohl nicht sein, oder ???
Ich habe WinXP Pro.
kann mir vieleicht jemand helfen ???
wäre jetzt echt wichtig, ist ja schon dumm denn ich habe diese Functionen jetzt extra geschrieben und es geht einfach nicht mit der DesktopListview-Handle.
Danke schon mal für eure Antworten.
PS. für die, die nicht richtig gelesen haben: Bei dem Deskop-ListView funzt das ganze nicht !!!
Cu
DaRoule :-)