![]() |
Probleme mit dem Valuelisteditor
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
ich habe ein paar Probleme mit dem ValueListeditor. Ich hoffe ihr könnt mir helfen. Also mein Problem: Mein Programm kann verschiedene (fremde) Fenster aus der Taskleiste entfernen und trägt sie in ein PopUp-Menü ein. Das klappt auch so weit. Dann hat es noch einen Fenster-Manager. Dort kann man gleich Fenster aus einem ValueListeditor heraus verschwinden bzw. anzeigen lassen. Doch habe ich das Problem, dass manchmal eine Acces Violation kommt. Sie kommt manchmal, wenn ich ein Fenster versteckt habe, dann Fenster geschlossen und wieder angezeigt wird. Oder auch erst wenn man dann das Programm wieder anzeigen lässt und dann das Fenster schließt und wieder öffnet. Die kann ich mir einfach nicht erklären. Vielleicht könnt ihr mir ja helfen. Da ich nicht genau weiß, wo dran es genau liegt, poste ich mal die gesamte Unit und hänge die exe auch mal dran. Der Code (unit):
Delphi-Quellcode:
Ich hoffe ihr könnt einem Ratlosen helfen!!! Vielen Dank schon mal.
unit windowmanager;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, ValEdit; type Tmanager = class(TForm) ValueListEditor1: TValueListEditor; Label1: TLabel; Label2: TLabel; Button1: TButton; Button2: TButton; procedure FormShow(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var manager: Tmanager; implementation uses Unit1; {$R *.dfm} function GetText(Wnd: HWND): string; //holt Fenster-Titel var textlength: Integer; Text: PChar; begin textlength := SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0); if textlength = 0 then Result := '' else begin GetMem(Text, textlength + 1); SendMessage(Wnd, WM_GETTEXT, textlength + 1, Integer(Text)); Result := Text; FreeMem(Text); end; end; function EnumWindowsProc(Wnd: HWND; lParam: lParam): BOOL; stdcall; //listet sichtbare Fenster, die in der Taskleiste sind, auf begin Result := True; if (IsWindowVisible(Wnd) or IsIconic(wnd)) and ((GetWindowLong(Wnd, GWL_HWNDPARENT) = 0) or (GetWindowLong(Wnd, GWL_HWNDPARENT) = GetDesktopWindow)) and (GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW = 0) and (IntToStr(Wnd) <> '' )then begin //hier hakt es dann, weiß aber nicht wo genau der Fehler ist. manager.ValueListEditor1.InsertRow(IntToStr(Wnd), GetText(Wnd), true); end; end; procedure Tmanager.FormShow(Sender: TObject); var Param: Longint; i : Integer; begin ValueListEditor1.Strings.Clear; EnumWindows(@EnumWindowsProc, Param); ShowMessage(IntToStr(ValueListEditor1.RowCount)); {Fenster aus array hinzufügen} for i:=0 to High(fenster) do begin manager.ValueListEditor1.InsertRow(fenster[i, 0]+'*', GetText(StrToInt(fenster[i, 0])), true); end; end; procedure Tmanager.Button1Click(Sender: TObject); //Fenster-verstecken Button var pos1 : Integer; title : String; begin pos1 := POS('*', ValueListEditor1.Keys[ValueListEditor1.Row]); if (pos1 <=0) then begin //vestecken... SetLength(fenster,High(fenster)+2); SetLength(fenster[High(fenster)],2); title := GetText(StrToInt(ValueListEditor1.Keys[ValueListEditor1.Row])); if (Length(title) >= 30) then title := Copy(title, 0, 28)+'...'; fenster[High(fenster),1] := title; fenster[High(fenster),0] := ValueListEditor1.Keys[ValueListEditor1.Row]; ShowWindow(StrToInt(fenster[High(fenster), 0]), SW_HIDE); {aktualiesieren...} ValueListEditor1.Keys[ValueListEditor1.Row] := ValueListEditor1.Keys[ValueListEditor1.Row]+'*'; end else MessageDlg('Fenster schon verborgen.', mtWarning, [mbok], 0); end; procedure Tmanager.Button2Click(Sender: TObject); //Fenster-Anzeigen Button var pos1, int, i : Integer; title : String; begin pos1 := POS('*', ValueListEditor1.Keys[ValueListEditor1.Row]); if (pos1 >=0) then begin title := ValueListEditor1.Values[ValueListEditor1.Keys[ValueListEditor1.Row]]; if (Length(title) >= 30) then title := Copy(title, 0, 28)+'...'; {nach String im Array suchen:} for i:=0 to High(fenster) do begin if (fenster[i, 1] = title) then int := i; end; ShowWindow(StrToInt(fenster[int, 0]), SW_SHOW); Form1.delete_row(int); {Manager-Fenster in den Vordergrund bringen} SetForegroundWindow(Handle); {aktualiesieren...} pos1 := POS('*', ValueListEditor1.Keys[ValueListEditor1.Row]); if (pos1 >=0) then begin ValueListEditor1.Keys[ValueListEditor1.Row] := COPY(ValueListEditor1.Keys[ValueListEditor1.Row], 1, pos1-1); end; end else MessageDlg('Fenster wurde nicht versteckt.', mtWarning, [mbok], 0); end; end. Alexander PS: An der Exe ist graphisch noch nichts gemacht worden. Sie hat in der TNA auch ncoh kein Icon!! |
Re: Probleme mit dem Valuelisteditor
Hallo!
Ein ähnliches Problem habe ich auch. Es hängt mit dem TValueListEditor zusammen. Wenn man Einträge erstellt und diese mit "ValueListEditor.Strings.Clear" löscht, bekommt man eine Access Violation. Ich weiss nicht voran es hängt, ich schätze es ist ein Bug im TValueListEditor. Werde jetzt weiter mal im Netz recherchieren. Liebe Grüsse, Marc Geldon (PRO IT SYSTEMS) |
Re: Probleme mit dem Valuelisteditor
Habe die Lösung des Problems gefunden.
Spiel dir das Delphi Update 7.1 ein (falls du Delphi 7 hast). Damit wird der Bug behoben. Gruss, Marc Geldon (PRO IT SYSTEMS) |
Re: Probleme mit dem Valuelisteditor
Das Thema ist schon mehr als ein Jahr alt, ich glaub ich bin damals auf ne Listview oder so umgestiegen oder habe ne Lösung gefunden . Das weiß ich gar nicht mehr so genau :lol:.
PS: Jupp, habe D7 (& D8 ) PPS: Aber erstmal herzlich willkommen und super das du die Suche benutzt hast :mrgreen: :thuimb: |
Re: Probleme mit dem Valuelisteditor
Ooopppss.... ich hätte mal aufs Datum schauen sollen ;-)
Danke für den Willkommensgruss. Bis in Kürze. Man liest sich im Forum. mfG, Marc |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz