| Autor |
Beitrag |
Tharian
Hält's aus hier
Beiträge: 9
|
Verfasst: 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
|
Verfasst: Mo 15.11.10 22:05
FindFirst, FindNext, Timer oder eigener Thread.
Für diesen Beitrag haben gedankt: Tharian
|
|
Daniel L.
      
Beiträge: 140
Erhaltene Danke: 14
W7, W8
TurboD Prof, Delphi Community
|
Verfasst: Mo 15.11.10 22:08
Ja, mit einem Timer Ereigniss
|
|
Tharian 
Hält's aus hier
Beiträge: 9
|
Verfasst: Mo 15.11.10 22:11
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 16.11.10 06:47
bummi hat folgendes geschrieben : | | 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 
Hält's aus hier
Beiträge: 9
|
Verfasst: 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:
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
|
Verfasst: Di 16.11.10 14:54
Dann poste doch bitte mal Deinen gesamten Quelltext.
Grüße
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 16.11.10 15:08
evtl hilft ja schon
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
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 16.11.10 15:12
Gausi hat folgendes geschrieben : | | 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 
Hält's aus hier
Beiträge: 9
|
Verfasst: 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).
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 public 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
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Di 16.11.10 15:30
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 public end; |
_________________ We are, we were and will not be.
Für diesen Beitrag haben gedankt: Tharian
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 182
Erhaltene Danke: 14
|
Verfasst: Di 16.11.10 16:24
Und warum eine Function ? Das Ergebnis wird nicht verwendet. Und die Namensgebung.....
|
|
Tharian 
Hält's aus hier
Beiträge: 9
|
Verfasst: Di 16.11.10 16:36
Jetzt hab ich diesen Fehler :/
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
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: 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
      
Beiträge: 182
Erhaltene Danke: 14
|
Verfasst: Di 16.11.10 19:28
Tharian hat folgendes geschrieben : | 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 
Hält's aus hier
Beiträge: 9
|
Verfasst: Di 16.11.10 19:40
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Di 16.11.10 19:52
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| If(FileExists('Hier steht die Datei inkl. Pfad'))then begin end else begin end; |
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
Für diesen Beitrag haben gedankt: Tharian
|
|