Entwickler-Ecke

Sonstiges (Delphi) - Programmlaufzeit Dokumentieren


5M17H - Sa 30.06.07 11:54
Titel: Programmlaufzeit Dokumentieren
HI all.
Schonmal entschuldigung das das Topic -sehr warscheinlich- wieder im falschen Bereich ist.

Wie manch einer eventuell -ich glaube zwar nich aber kann sein- schon auf meinem Blog [http://www.oliver.lippert.it] gelesen hat bin ich dabei ein Programm zu schreiben was Dokumentieren soll wie lange ein Programm läuft. Dazu benötige ich die Überschrift vom Programm.

Ich habe schonmal ein Programm geschrieben was den TaskManager beendet. Aber sowas nich.

Prograspezifische sachen lest bitte auf dem Webblog.

Wie komme ich an diese Überschriften. Ich habe schon hier im Forum gesucht aber das was da so kommt -kompletter quellcode z.B.- is mir bischen Kürre und ich weiß nicht ob dass das ist was ich suche.

Würde mich über eure hilfe freuen.

MFG Oli


GTA-Place - Sa 30.06.07 12:29

Such mal nach Suche in der Entwickler-Ecke FINDWINDOW und das hier angucken: http://www.devblog.de/index.php/archives/2005/01/04/18/


5M17H - Sa 30.06.07 13:52

Dickes Danke.
Ehrlich gesagt musste ich mir die .pas laden und sie erst ab- und dann umschreiben.

Jetzt listet er schon alle .exe prozesse. Ich glaube jetzt kann ich auf dem alten programm aufsetzen... mal sehen.

Ich melde mcih bei schwierigkeiten.

MFG OLI

[edit]
Jetz habich quasi ne auflistung aller tasts mit den exe dateien.
Wie komme ich jetzt an die Fensternamen, denn die brauche cih für FindWindow, und das heißt ich brauche FindWindow nich weil ich brauche nur die Fensternamen mehr ncih....


ZeitGeist87 - Sa 30.06.07 14:16

Wenn du die EXE-Namen hast, brauchst du doch die Fensternamen nicht mehr..


5M17H - Sa 30.06.07 14:30

FindWindow braucht nicht den exe namen sondern den Fensternamen.
Wie komme ich an den Fensternamen. Brauche ich dazu überhaupt den .exe namen?


elundril - Sa 30.06.07 14:34

du kannst ja auch einfach nachschauen wie lange die Exe rennt oder?? dann hast du die exakte programm lauf zeit. denn es kann sein das das Fenster vom programm nie angezeigt wird.

lg elundril


ZeitGeist87 - Sa 30.06.07 14:35

Du willst doch nur wissen, wie lang ein Programm läuft oder?

also mal Pseudocode


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
 Timer
 begin
  holeAlleAktivenAnwendungen();
  VergleicheAnwendung mit Liste()
  NeuerName = true
   StarteZeitMessung(NeuerName);
  NameNichtMehrVorhanden = true
   SchliesseZeitMessung(NameNichtMehrVorhanden);
 end;


LG
Stefan


5M17H - Sa 30.06.07 14:36

Geh ma auch meinen blog [http://www.oliver.lippert.it] und schau dir den Aktuellsten post an. Da wirst du sehen was ich noch alles machn will mit dem Programm.

MFG Oli. Danke trotzdem für die Antwort.


ZeitGeist87 - Sa 30.06.07 14:39

user profile icon5M17H hat folgendes geschrieben:
Geh ma auch meinen blog [http://www.oliver.lippert.it] und schau dir den Aktuellsten post an. Da wirst du sehen was ich noch alles machn will mit dem Programm.

MFG Oli. Danke trotzdem für die Antwort.


Check ich ned...
Wenn ich im FireFox Tabbed-Browsing benutz hab ich ständig n neuen Fensternamen, obwohl die EXE die selbe beleibt..
Du solltest deine Theorie mal bissl durchdenken..


5M17H - Sa 30.06.07 15:14

Ja ist ja nich schlim.
Da muss ich mir nochwas überlegen.
Aber bei den anderen bleibt es ja meißtens gleich.
Is ja auch egal. Wie komme ich an den FEnsternamen?


ZeitGeist87 - Sa 30.06.07 16:06

Die folgende Methode verwendet die Systenfunktion EnumWindows. Dabei wird dann die Callback Prozedur mit den entsprechenden Parametern aufgerufen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function EnumWinProc(Wnd: THandle; LParam: LongInt): Boolean; stdcall;
var
 WinCaption : string;
 Len: integer;
begin
 Result := True;
 Len := GetWindowTextLength(Wnd);
 SetLength(WinCaption, Len);
 GetWindowText(Wnd, PChar(WinCaption), Len+1);
 if Trim(WinCaption) <> '' then
   Form1.Listbox1.Items.Add(Format('%.6x : %s', [Wnd, WinCaption]));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  EnumWindows(@EnumWinProc, 0);
end;


In diesem Fall werden die Informationen in Listbox1 ausgegeben, die sich auf Form1 befinden muss.
Zuerst wird eine 6stellige Hex-Zahl ausgegeben, die das Handle des Fensters darstellt, dann wird der Titel ausgegeben.
Die Ausgabe kann über die Parameter der Funktion Format angepasst werden.


5M17H - Sa 30.06.07 17:24


programm_auflisten.pas - Funktion
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function ProgrammnamenAusgeben(Wnd: THandle; LParam: LongInt): Boolean; stdcall;
var Rueck : Boolean;
    Laenge : Integer;
    Text : String;
begin
  Rueck := true;
  laenge := GetWindowTextLength(Wnd);
  SetLength(Text, laenge);
  GetWindowText(Wnd, PChar(Text), laenge+1);
  if trim(Text) <> '' then

  result := rueck;
end;

Tja so siehts aus. Was allerdings nicht geht: unter das If irgendwas mit Form1 zu schreiben das kennt er nciht.. warum?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
type
  TProgramme = class(TObject)
    private
      ProzessListe : TStringList;
      ProgrammListe : TStringList;
    public
      constructor Anlegen(anzeigen, anzeigen2 : TMemo);
      destructor Aufloesen;
      procedure Erneuern(anzeigen, anzeigen2 : TMemo);
  end;
  function ProgrammnamenAusgeben(Wnd: THandle; LParam: LongInt): Boolean; stdcall;


Anbei nochne frage. Was ist stdcall?


ZeitGeist87 - Sa 30.06.07 17:48

STDLL sagt dir, dass es sich um eine Funktion/Prozedur handelt, die in einer DLL liegt/liegen soll.

Da ich annehme, dass du keine DLL verwendest kannst du das STDCALL einfach weglassen.

Warum er das nicht kennt ist einfach


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
function TForm1.ProgrammnamenAusgeben(Wnd: THandle; LParam: LongInt): Boolean;
var Rueck : Boolean;
    Laenge : Integer;
    Text : String;
begin
//..
end;


LG
Stefan


5M17H - Sa 30.06.07 18:42


programm_auflisten.pas - Funktion
1:
2:
3:
function ProgrammnamenAusgeben(Wnd: THandle; LParam: LongInt): Boolean; stdcall;
var Rueck : Boolean;
    Laenge : Integer;

Achte bitte auf den Titel. Die Funktion liegt in einer *.pas Datei.
Von Daher kann ich das ja nicht so machen.


Regan - Sa 30.06.07 18:52

Also ich hab da schonmal ein programm geschrieben. und zwar das [http://www.delphi-forum.de/viewtopic.php?t=73349]. Wenn du willst kann ich dir mal ein bisschen code geben.

B2T:
Doch kannst du, indem du die function deklarierst.

Delphi-Quelltext
1:
2:
public
   function ProgrammnamenAusgeben(Wnd: THandle; LParam: LongInt): Boolean; stdcall;

Und schon kannst du von einer anderen Form daraufzugreifen.


5M17H - Sa 30.06.07 19:07


Delphi-Quelltext
1:
2:
3:
function TProgramme.ProgrammnamenAusgeben(Wnd: THandle;
  LParam: Integer): Boolean;
var Rueck : Boolean;

So Inzwischen ist es in der klasse TProgramme.

Bringt auchnihts. "Form1.irgendwas.und.egalwas" geht immernoch nicht... 'Nicht deklarierter bezeichner'


ZeitGeist87 - Sa 30.06.07 19:21

user profile icon5M17H hat folgendes geschrieben:

programm_auflisten.pas - Funktion
1:
2:
3:
function ProgrammnamenAusgeben(Wnd: THandle; LParam: LongInt): Boolean; stdcall;
var Rueck : Boolean;
    Laenge : Integer;

Achte bitte auf den Titel. Die Funktion liegt in einer *.pas Datei.
Von Daher kann ich das ja nicht so machen.


HÄ????

Ich will ja nich unhöflich oder beleidigend werden, aber was is denn das fürn Schwachsinn?

*.pas kannst du doch ganz normal bearbeiten und und und..


Regan - Sa 30.06.07 20:41

Zeig doch mal ein bisschen Code. Sonst kann man das schwer sagen.


ZeitGeist87 - Sa 30.06.07 20:53

user profile icon5M17H hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
function TProgramme.ProgrammnamenAusgeben(Wnd: THandle;
  LParam: Integer): Boolean;
var Rueck : Boolean;

So Inzwischen ist es in der klasse TProgramme.

Bringt auchnihts. "Form1.irgendwas.und.egalwas" geht immernoch nicht... 'Nicht deklarierter bezeichner'


TFORM1


Regan - Sa 30.06.07 21:02

user profile iconZeitGeist87 hat folgendes geschrieben:
user profile icon5M17H hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
function TProgramme.ProgrammnamenAusgeben(Wnd: THandle;
  LParam: Integer): Boolean;
var Rueck : Boolean;

So Inzwischen ist es in der klasse TProgramme.

Bringt auchnihts. "Form1.irgendwas.und.egalwas" geht immernoch nicht... 'Nicht deklarierter bezeichner'


TFORM1
muss nicht unbedingt sein. es geht auch ohne. hast du die .pas-datei auch in der uses-klausel reingeschrieben? und heißt Form1 wirklich Form1 oder vielleicht TProgramme?


ZeitGeist87 - Sa 30.06.07 21:11

ich kann ne funktion/prozedure deklarieren ohne T?

hmm..sag mal wasn heut los..hab ihr euch heut alle verschworen..wir lassen stefan noch was lernen? :)


Regan - Sa 30.06.07 21:17

das musst du mir mal erklären?
Er hat doch die function mit TProgramme deklariert:
user profile icon5M17H hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
function TProgramme.ProgrammnamenAusgeben(Wnd: THandle;
  LParam: Integer): Boolean;
var Rueck : Boolean;

So Inzwischen ist es in der klasse TProgramme.
Bringt auchnihts. "Form1.irgendwas.und.egalwas" geht immernoch nicht... 'Nicht deklarierter bezeichner'

Und oben wird er die so deklariert haben:

Delphi-Quelltext
1:
2:
3:
4:
TProgramme=Class //oder ähnlich
{...}
public //ganz wichtig, sonst kannst du nicht darauf zugreifen (fehler auch im anderen threat berichtigt)
   function ProgrammnamenAusgeben(Wnd: THandle; LParam: LongInt): Boolean;

Nur ruft er die Form1 auf. Vielleicht heißt die Form1 gar nicht Form1, weil er sie in Programme umbenannt hat. Vielleicht hat er auch gar keine Form1 und nur eine .pas-datei, dann brauch er einen Constructor und einen Destructor (nicht unbedingt). Vielleicht hat er auch einfach die .pas-datei nicht in die uses reingschrieben, aber dann würde es delphi automatisch hinzufügen.


ZeitGeist87 - Sa 30.06.07 21:38

user profile iconRegan hat folgendes geschrieben:
das musst du mir mal erklären?
Er hat doch die function mit TProgramme deklariert:
user profile icon5M17H hat folgendes geschrieben:

Delphi-Quelltext
1:
2:
3:
function TProgramme.ProgrammnamenAusgeben(Wnd: THandle;
  LParam: Integer): Boolean;
var Rueck : Boolean;

So Inzwischen ist es in der klasse TProgramme.
Bringt auchnihts. "Form1.irgendwas.und.egalwas" geht immernoch nicht... 'Nicht deklarierter bezeichner'

Und oben wird er die so deklariert haben:

Delphi-Quelltext
1:
2:
3:
4:
TProgramme=Class //oder ähnlich
{...}
public //ganz wichtig, sonst kannst du nicht darauf zugreifen (fehler auch im anderen threat berichtigt)
   function ProgrammnamenAusgeben(Wnd: THandle; LParam: LongInt): Boolean;

Nur ruft er die Form1 auf. Vielleicht heißt die Form1 gar nicht Form1, weil er sie in Programme umbenannt hat. Vielleicht hat er auch gar keine Form1 und nur eine .pas-datei, dann brauch er einen Constructor und einen Destructor (nicht unbedingt). Vielleicht hat er auch einfach die .pas-datei nicht in die uses reingschrieben, aber dann würde es delphi automatisch hinzufügen.


mein Kommentar war positiv gemeint :)


5M17H - Sa 30.06.07 23:43


Programme_Auflisten.pas
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
unit programme_auflisten;

interface

uses TlHelp32, Classes, StdCtrls;

type
  TProgramme = class(TObject)
    private
      ProzessListe : TStringList;
      ProgrammListe : TStringList;
    public
      constructor Anlegen(anzeigen, anzeigen2 : TMemo);
      destructor Aufloesen;
      procedure Erneuern(anzeigen, anzeigen2 : TMemo);
      function ProgrammnamenAusgeben(Wnd: THandle; LParam: LongInt): Boolean; stdcall;
  end;

implementation

uses
  SysUtils, Windows;

constructor TProgramme.Anlegen(anzeigen, anzeigen2 : TMemo);
begin
  ProzessListe := TStringList.Create;
  ProgrammListe := TStringList.Create;
  Erneuern(anzeigen, anzeigen2);
end;

destructor TProgramme.Aufloesen;
begin
  ProzessListe.Free;
end;

procedure TProgramme.Erneuern(anzeigen, anzeigen2 : TMemo);
var weiter : boolean;
    aktFenster : THandle;
    aktProzess : TProcessEntry32;
    i: Integer;
begin
  ProzessListe.Clear;
  aktFenster := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  aktProzess.dwSize := SizeOf(TProcessEntry32);
  weiter := Process32First(aktFenster, aktProzess);
  while weiter = true do
  begin
    ProzessListe.Add(String(ExtractFileName(aktProzess.szExeFile)));
//    ProgrammListe.Add(ProgrammnamenAusgeben(aktFenster));
    weiter := Process32Next(aktFenster, aktProzess);
  end;
  CloseHandle(aktFenster);
  for I := 0 to ProzessListe.Count - 1 do
  begin
    anzeigen.lines.add(ProzessListe[i]);
//    anzeigen2.lines.add(ProgrammListe[i]);
  end;
end;

function TProgramme.ProgrammnamenAusgeben(Wnd: THandle;
  LParam: Integer): Boolean;
var Rueck : Boolean;
    Laenge : Integer;
    Text : String;
begin
  Rueck := true;
  laenge := GetWindowTextLength(Wnd);
  SetLength(Text, laenge);
  GetWindowText(Wnd, PChar(Text), laenge+1);
  if trim(Text) <> '' then
    Form1.memo2.lines.add(text);
  result := rueck;
end;


end.



und das geht nicht. Auchnicht mit TForm1
1:
2:
if trim(Text) <> '' then
    Form1.memo2.lines.add(text);


Prozessdoku.pas (Mit Form)
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
unit prozessdoku;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, AppEvnts, ExtCtrls, programme_auflisten;

type

  TForm1 = class(TForm)
    TrayIcon1: TTrayIcon;
    ApplicationEvents1: TApplicationEvents;
    Memo1: TMemo;
    Timer1: TTimer;
    Memo2: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Enabled := True;
  Timer1.Interval := 15000;
  Timer1Timer(Sender);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var i, FensterName : integer;
begin
  EnumWindows(@TProgramme.ProgrammnamenAusgeben, 0);
end;

end.


[edit]
Es geht aucnicht wenn ich die prozessdoku.pas bei der programme_auflisten.pas einbinde.
'Zirkuläre Unit Referenc'


Regan - So 01.07.07 19:48

Mir scheint als hättest du keine Ahnung vom Erstellen von extra Dateitypen. Also:

Programme_auflosten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
unit programme_auflisten;

interface

uses TlHelp32, Classes, StdCtrls;

type
  TProgramme = class(TObject)
    private
      ProzessListe : TStringList;
      ProgrammListe : TStringList;
      anzeigen:TMemo;
      anzeigen2:TMemo;
    public
      constructor Create(anzeigen11, anzeigen12 : TMemo); //Geändert
      destructor Destroy;               //Geändert
      procedure Erneuern;               //Geändert, nicht merh nötig.
      procedure Free;                 //Hinzugefügt
      procedure Zeigen;                //hinzugefügt
      function ProgrammnamenAusgeben(Wnd: THandle; LParam: LongInt): Boolean; stdcall;
  end;

implementation

uses
  SysUtils, Windows, prozessdoku;

constructor TProgramme.Create(anzeigen11, anzeigen12 : TMemo);     //Geändert
begin
inherited Create;
  ProzessListe := TStringList.Create;
  ProgrammListe := TStringList.Create;
  anzeigen:=anzeigen11;             //Hinzugefügt, jetzt global verwendbar
  anzeigen2:=anzeigen12;            
  Erneuern;                        //Geändert
end;

destructor TProgramme.Destroy;       //in destroy, wenn TProgramme.Destroy und existiert nicht mehr, dann fehler
begin
inherited Destroy;
  ProzessListe.Free;
end;

procedure TProgramme.Free;           //Free-Prozedur
begin
  if self<>nil then          //Wenn TPRogramme existiert, dann erst zerstören, sonst nicht 
  Destroy;
end;

procedure TProgramme.Erneuern;
var weiter : boolean;
    aktFenster : THandle;
    aktProzess : TProcessEntry32;
    i: Integer;
begin
  ProzessListe.Clear;
  aktFenster := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  aktProzess.dwSize := SizeOf(TProcessEntry32);
  weiter := Process32First(aktFenster, aktProzess);
  while weiter = true do
  begin
    ProzessListe.Add(String(ExtractFileName(aktProzess.szExeFile)));
//    ProgrammListe.Add(ProgrammnamenAusgeben(aktFenster));
    weiter := Process32Next(aktFenster, aktProzess);
  end;
  CloseHandle(aktFenster);
  for I := 0 to ProzessListe.Count - 1 do
  begin
    anzeigen.lines.add(ProzessListe[i]);
//    anzeigen2.lines.add(ProgrammListe[i]);  
  end;
end;

function TProgramme.ProgrammnamenAusgeben(Wnd: THandle;
  LParam: Integer): Boolean;
var Rueck : Boolean;
    Laenge : Integer;
    Text : String;
begin
  Rueck := true; 
  laenge := GetWindowTextLength(Wnd);
  SetLength(Text, laenge);
  GetWindowText(Wnd, PChar(Text), laenge+1);
  if trim(Text) <> '' then
  begin
  anzeigen2.lines.add(text);       
  end;
  result := rueck;
end;

procedure TProgramme.Zeigen;  //TestProzedur, zum Ausprobieren :-)
begin
  anzeigen.Lines.Add('Hallo');
  anzeigen2.Lines.Add('Fritz');
end;



end.

Im folgenden habe ich das TrayIcon und die Application Events entfernt und eine Button hinzugefügt.

prozessdoku
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
unit prozessdoku;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, AppEvnts, ExtCtrls, programme_auflisten;

type

  TForm1 = class(TForm)
    Memo1: TMemo;
    Timer1: TTimer;
    Memo2: TMemo;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
      Programme:TProgramme;       //Typ von prozesse_auflisten
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject); //Button Prozedur
begin
Programme.Zeigen;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Programme:=TProgramme.Create(Memo1,Memo2);      //erstellt Typ. Wichtig: davor erstellen sonst fehler bei Timer1Timer
  Timer1.Enabled := True;
  Timer1.Interval := 15000;
  Timer1Timer(Sender);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Programme.Free; //Speicher Freigeben
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var i, FensterName : integer;
begin
  EnumWindows(@TProgramme.ProgrammnamenAusgeben, 0);
end;

end.

So sollte das eigentlich funktionieren.

OffTopic: Wirst du das Programm auch zum Download anbieten?


5M17H - So 01.07.07 20:28

Ja auf jeden fall. Ich werde wohl ne weile brauchen.. Und ich hoffe ich werde in den nächsten 2 Wochen fertig, denn am 15 gehts für 4 we nach England dann 1tag zu Hause und noch eine Woche weg... Soll heißen. In dieser Zeit kann ich NICHTS machen... ;-)

Ahso morgen werde ich testen ob alles klappt.. Danke für deinen Post.


rizla - So 01.07.07 20:32

user profile icon5M17H hat folgendes geschrieben:
Ich werde wohl ne weile brauchen.. Und ich hoffe ich werde in den nächsten 2 Wochen fertig


du musst dein blog dann noch mal anpassen.
wegen der zeit, zu der du fertig sein willst ;)

:r:


5M17H - Mo 02.07.07 15:40


Programm Titel ausgeben
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function TProgramme.ProgrammnamenAusgeben(Wnd: THandle;  LParam: Integer): Boolean;
var Laenge : Integer;
    Text : String;
    rueck: boolean;
begin
  Rueck := true;
  laenge := GetWindowTextLength(Wnd);
  SetLength(Text, laenge);
  GetWindowText(Wnd, PChar(Text), laenge+1);
  if trim(Text) <> '' then
    form1.memo2.lines.add(text);
  result := rueck;
end;



Auslöser
1:
2:
3:
4:
5:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  TProgramme.Anlegen(memo1);
  EnumWindows(@TProgramme.ProgrammnamenAusgeben,0);
end;


Leider geht 'TProgramme.ProgrammnamenAusgeben' inner das gleiche durch, wnd is quasi immer der gleiche wert und erfüllt nicht die bedingung im if. So bekomme ich nie was ins Memo2.
Ahso diese Funktion habe ich mit mienem Lehrer ausgearbeitet... Also ist sie an sich richtig, nur wie bestimme ich wnd?


Regan - Mo 02.07.07 17:33

Neue Frage:= Neues Thread.


5M17H - Mo 02.07.07 17:52

Geht ums gleiche Thema... "Programmlaufzeit Dokumentieren" und das gehört wohl dazu ;-)


Regan - Mo 02.07.07 18:11

Wie mans nimmt. B2T: Ich weiß zwar nichtm warum du an wnd kommen willst. Ich in meinem Programm überprüfe mit einem Timer einfach nur ob eine exe läuft und wenn ja dann erhöhe ich den zähler um eins. warum willst du noch wnd haben?


5M17H - Mo 02.07.07 18:23


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function TProgramme.ProgrammnamenAusgeben(Wnd: THandle;  LParam: Integer): Boolean;
var Laenge : Integer;
    Text : String;
    rueck: boolean;
begin
  Rueck := true;
  laenge := GetWindowTextLength(Wnd);
  SetLength(Text, laenge);
  GetWindowText(Wnd, PChar(Text), laenge+1);
  if trim(Text) <> '' then
    form1.memo2.lines.add(text);
  result := rueck;
end;

Das erhöht keinen zähler oder? Diese Funktion soll in ein Memo alle Fenstertitel schreiben.. Also muss ich wnd übergeben, weil mit dem 'aktuellen' wert von memo kann er nichts anzeigen, und der wert wnd verändert sich nie.


Christian S. - Mo 02.07.07 18:59

Nicht alles, was mit Deinem Programm zu tun hat, gehört in einen Thread. Beim Schreiben eines Programmes begegnet man verschiedenen Problemen - und die gehören dann auch in verschiedene Threads -> geschlossen.