Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Probleme mit dem Valuelisteditor (https://www.delphipraxis.net/6212-probleme-mit-dem-valuelisteditor.html)

Alexander 3. Jul 2003 17:24


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:
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.
Ich hoffe ihr könnt einem Ratlosen helfen!!! Vielen Dank schon mal.
Alexander
PS: An der Exe ist graphisch noch nichts gemacht worden. Sie hat in der TNA auch ncoh kein Icon!!

proitsystems 27. Okt 2004 22:10

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)

proitsystems 27. Okt 2004 22:46

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)

Alexander 29. Okt 2004 22:51

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:

proitsystems 30. Okt 2004 01:55

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 01:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz