Autor Beitrag
Tharian
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 15.11.10 21:48 
Guten Abend zusammen,

vorab - ich bin noch recht neu bei Delphi, also wenn möglich keine zu komplexe Methoden ;)

Ich würde gerne wissen, wie ich ein Programm permanent bzw. alle paar Sekunden überprüfen lassen kann, ob eine von 9 Dateien sich im Verzeichnis befindet. Falls ja, soll je nach gefundener Datei eine bestimmte Aktion ausgelöst werden (die Caption eines Labels ändern, aber das ist erstmal unwichtig). Das soll einfach im Hintergrund laufen und nicht jedes mal neu durch einen Button oder ähnliches ausgelöst werden. Ist das irgendwie möglich?

Danke schonmal,
Tharian
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 15.11.10 22:05 
FindFirst, FindNext, Timer oder eigener Thread.

Für diesen Beitrag haben gedankt: Tharian
Daniel L.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 140
Erhaltene Danke: 14

W7, W8
TurboD Prof, Delphi Community
BeitragVerfasst: Mo 15.11.10 22:08 
Ja, mit einem Timer Ereigniss
Tharian Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 15.11.10 22:11 
user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
FindFirst, FindNext, Timer oder eigener Thread.


Danke, ich hab dazu gerade diesen Codeschnipsel gefunden:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
var
  searchResult : TSearchRec;

begin
  // Try to find regular files matching Unit1.d* in the current dir
  if FindFirst('Unit1.d*', faAnyFile, searchResult) = 0 then
  begin
    repeat
      ShowMessage('File name = '+searchResult.Name);
      ShowMessage('File size = '+IntToStr(searchResult.Size));
    until FindNext(searchResult) <> 0;

    // Must free up resources used by these successful finds
    FindClose(searchResult);
  end;
end;


Dabei wird wohl solange gesucht, bis eine Datei mit dem entsprechenden Namen gefunden wird, oder? Kann man das einfach so laufen lassen oder kostet das zu viel Leistung? Wie würde das mit dem Timer funktionieren, also dass es - sagen wir - alle 5 Sekunden gesucht wird?
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Mo 15.11.10 22:15 
Bei den Jedis war IMHO auch ein ShellNotifyEvent dabei.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 16.11.10 06:47 
user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
Bei den Jedis war IMHO auch ein ShellNotifyEvent dabei.
Dafür braucht man die JEDIs nicht, es reicht auch die reine API, z.B. mit ReadDirectoryChanges:
msdn.microsoft.com/e...aa365465(VS.85).aspx
Natürlich sind Komponenten ggf. einfacher, dafür auch umständlicher.

Für diesen Beitrag haben gedankt: Tharian
Tharian Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 16.11.10 14:51 
Ok, ich habs jetzt mal versucht... aber ich glaube irgendwas stimmt mit der Funktion nicht. Allerdings kommt nur ein einziger Error, und zwar dass 'Button2' ein undefinierter Bezeichner sei (er exisitiert aber). Das ist der Code bzw. die Stelle:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function  searchResult : TSearchRec;
var searchResult : TSearchRec;
begin
  if FindFirst('Test.txt*', faAnyFile, searchResult) = 0 then
  begin
    repeat
      ShowMessage('File name = '+searchResult.Name);
      ShowMessage('File size = '+IntToStr(searchResult.Size));
    until FindNext(searchResult) <> 0;

    if FindFirst('Test.txt*', faAnyFile, searchResult) = 1 then
    Button2.Caption:='X';
    FindClose(searchResult);
  end;
end;
PistolenPeter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 16.11.10 14:54 
Dann poste doch bitte mal Deinen gesamten Quelltext.

Grüße
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Di 16.11.10 15:08 
evtl hilft ja schon
ausblenden Delphi-Quelltext
1:
Form1.Button2.Caption:='X';					
Wenn der Bezeichner so geblieben ist "Form1".

Gruss ALf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Di 16.11.10 15:10 
Du hast da eine lose Funktion, keine Methode der Form. Daher kennt diese Funktion den Button nicht. Du kannst entweder den Button ansprechen über Form1.Button2 (oder wie die Form auch heißen mag).

Oder, imho besser: Du machst die Funktion zu einer Methode der Form, also
function  TForm1.searchResult : TSearchRec; und trägst die Methode auch oben in der Definition von TForm1 ein, also da, wo auch die ganzen anderen Prozedur-Namen aufgeführt sind.

_________________
We are, we were and will not be.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 16.11.10 15:12 
user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
Oder, imho besser: Du machst die Funktion zu einer Methode der Form
Nicht nur besser, sondern vor allem richtiger.

Denn ohne das spricht man den Button der Instanz des Formulars an, das zufällig in der globalen Variablen Form1 liegt (und wundert sich ggf. warum nix passiert). Wenn es eine Methode des Formulars ist, spricht man die richtige Instanz an.
Tharian Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 16.11.10 15:29 
Ok, das klingt alles logisch... aber es funktioniert trotzdem nicht. Ich poste jetzt einfach mal den ganzen Code, auch wenn das noch lange nicht fertig ist. Kurze Erklärung: Das wird ein Multiplayer-TicTacToe, das über Dateien in einem Shared-Ordner von Dropbox kommuniziert. Ich weis, ist unglaublich bescheuert. Aber ich wills trotzdem ausprobieren ;)

Aktuell kommen 2 Fehler, einmal sei SearchResult undefiniert, und dann erwartet er bei 'function TForm1.searchResult : TSearchRec;' einen : statt einem ; (was allerdings nichts ändert, wenn ich das anpasse).

ausblenden volle Höhe Delphi-Quelltext
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:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    TForm1.SearchResult : TSearchRec;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Playersymbol :char;


implementation



{$R *.dfm}


function TForm1.SearchResult ; TSearchRec;
var searchResult : TSearchRec;
begin

  if FindFirst('Test.txt*', faAnyFile, searchResult) = 0 then
  begin
    repeat
      ShowMessage('File name = '+searchResult.Name);
      ShowMessage('File size = '+IntToStr(searchResult.Size));
    until FindNext(searchResult) <> 0
    end;
    if FindFirst('Test.txt*', faAnyFile, searchResult) = 1 then
    Form1.Button2.Caption:='X';

    FindClose(searchResult);
  end;


procedure TForm1.Button1Click(Sender: TObject);
var f: Textfile;
begin

begin

if Playersymbol=''
  then Playersymbol:='X'
  else if
    Playersymbol='X'
    then Playersymbol:='O'
    else Playersymbol:='O';

Button1.Caption:=Playersymbol;

end;

begin
  if FileExists('Feldas1.txt'then
    begin
      AssignFile(f, 'Feldas1.txt');
      Append(f);
      Writeln(f, '');
      CloseFile(f);
    end
  else
    begin
      AssignFile(f, 'Feldas1.txt');
      Rewrite(f);
      Writeln(f, '');
      CloseFile(f);
  end;

Playersymbol:='O'

end;

end;

end.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Di 16.11.10 15:30 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    function SearchResult : TSearchRec;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

_________________
We are, we were and will not be.

Für diesen Beitrag haben gedankt: Tharian
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 16.11.10 16:18 
Unter published im Standardbereich ist aber schlecht, das mag Delphi absolut nicht. Besser unter private, public oder wirklich published.

Für diesen Beitrag haben gedankt: Tharian
guinnes
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 182
Erhaltene Danke: 14



BeitragVerfasst: Di 16.11.10 16:24 
Und warum eine Function ? Das Ergebnis wird nicht verwendet. Und die Namensgebung.....
Tharian Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 16.11.10 16:36 
Jetzt hab ich diesen Fehler :/

ausblenden Delphi-Quelltext
1:
2:
[Fehler] Unit1.pas(20): Ungenügende Forward- oder External-Deklaration: 'TForm1.SearchResult'
[Fataler Fehler] Project1.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden


Die Function soll später noch verwendet werden, das kommt noch... aber solange sie nicht läuft kann ich das gar nicht ;)
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 16.11.10 17:07 
Leg mal ein , zwei Buttons auf Dein Formular, versorge das OnClick und schau Dir an wie der Deklarationsteil und wie der Implementationteil aussieht.

in der Klassendeklaration immer ohne z.B: Tform1
in implementation immer MIT TForm1. sofern es sich um Klassenfunktionen/Prozeduren handelt.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
guinnes
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 182
Erhaltene Danke: 14



BeitragVerfasst: Di 16.11.10 19:28 
user profile iconTharian hat folgendes geschrieben Zum zitierten Posting springen:
Die Function soll später noch verwendet werden, das kommt noch... aber solange sie nicht läuft kann ich das gar nicht ;)

1. Deine Funktion heißt genau so wie deine lokale Variable, ich weiß nicht, was Delphi da macht
2. Du fragst nicht nach einer Datei, sondern nach mehreren. Dein Result gibt dir im besten Fall die Informationen der letzten zurück
3. Du weist nirgendwo ein Ergebnis ( Result ) zu
4. Du rufst deine Funktion ja noch gar nicht auf
Tharian Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 16.11.10 19:40 
user profile iconguinnes hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconTharian hat folgendes geschrieben Zum zitierten Posting springen:
Die Function soll später noch verwendet werden, das kommt noch... aber solange sie nicht läuft kann ich das gar nicht ;)

2. Du fragst nicht nach einer Datei, sondern nach mehreren. Dein Result gibt dir im besten Fall die Informationen der letzten zurück
3. Du weist nirgendwo ein Ergebnis ( Result ) zu


2. Wie kann ich denn dann nach genau einer mit einem genau definieren Namen suchen?
3. Ich dachte das mache ich mit ' if FindFirst('Test.txt*', faAnyFile, searchResult) = 1 then', wo im Falle eines Fundes die Caption von Button2 verändert werden soll. Geht das nicht so?
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Di 16.11.10 19:52 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
If(FileExists('Hier steht die Datei inkl. Pfad'))then
 begin
  // Datei existiert.
 end
else
 begin
  // Datei existiert nicht.
 end;

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)

Für diesen Beitrag haben gedankt: Tharian