Entwickler-Ecke
Open Source Projekte - Shutdown-Disc-Ejector (eingestellt / Delphidateien zum DL)
CrazyLuke - Di 22.03.05 17:28
Titel: Shutdown-Disc-Ejector (eingestellt / Delphidateien zum DL)
U.a. mangels Interesse setze ich das Projekt
PrakTischRechner [
http://www.delphi-forum.de/topic_PrakTischRechner+Einheitenumrechner+etc_34935.html] erstmal hinten an.
Statt dessen würde ich erstmal wieder etwas Kleineres wagen, wobei ich hoffe, dass das Interesse stimmt und sich vielleicht noch jemand für diese Partnerarbeit meldet, da es größer wird als M.I.B.
Bei allen mir bekannten CD/DVD-Eject-Programmen fällt mir negativ auf, dass sie, wenn man Windows herunterfährt, die vollen Laufwerke auswerfen. Das Blöde daran ist, dass man nachher zwar die Discs rausnehmen kann, dann aber offene Laufwerksschubladen hat und der PC aus ist :(
Daher würde ich gerne ein Programm programmieren mit folgenden Optionen:
Programm startet, findet keine Disc:
- Programm wird sofort beendet und Windows heruntergefahren
Programm startet, findet Disc:
- Betreffende Laufwerke werden geöffnet
-
Wahlweise: Programm wartet, bis alle Laufwerke geschlossen worden sind
-
Wahlweise: Programm wartet, bis Countdown abgelaufen ist
-
Wahlweise: Programm wartet, bis bestimmte Taste gedrückt wird
- Laufwerke werden ggf. geschlossen
- Programm wird beendet und Windows heruntergefahren
Dies hat den Vorteil, dass das der Saft erst endgültig abgestellt wird, wenn alle Laufwerke wieder zu sind - und das Programm muss unter Windows nicht die ganze Zeit im Hintergrund laufen.
Wer Windows nicht über das Programm, sondern weiterhin über die windows-interne Funktion im Startmenü abschalten möchte, kann das Programm auch als Shutdowndienst aktivieren. Für diesen Fall muss natürlich eine optinal abwählbare Funktion "Bei Programmende PC herunterfahren" vorhanden sein.
Des Weiteren wäre es auch denkbar, die Programmfunktionen auf andere Laufwerksgruppen wie Diskette oder ZIP auszuweiten, wo dann je nach Laufwerkfähigkeiten entweder die Medien ausgeworfen werden oder nur eine Meldung ausgegeben wird. Und man kann evtl. auch einzelne Laufwerke davon ausschließen. Aber das kommt denk ich mal in späteren Versionen.
Ich wäre sehr erfreut über jede Rückmeldung, sei es nun nur wegen Interesse, Verbesserungsvorschlägen oder auch Partnerarbeit.
MfG
CrazyLuke
Moderiert von
AXMD: Topic aus Gemeinschaftsprojekte verschoben am Do 21.07.2005 um 22:35
F34r0fTh3D4rk - Di 22.03.05 17:37
das ist doch kein ding, dat is a bissl quellcode und das wars, status abfragen, schließen, windows beenden verzögern und windows beenden, mehr brauchst du ja net.
schnell mal ausm eh:
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:
| procedure GetDrives(const AItems: TStrings); const DriveTypeTexts: array[DRIVE_UNKNOWN..DRIVE_RAMDISK] of String = ('Unbekannt', 'Kein Wurzelverzeichnis', 'Diskette', 'Festplatte', 'Netzlaufwerk', 'CDROM', 'RAMDisk'); var Drive: Char; DriveType: Integer; DriveMask: Integer; Flag: Integer; begin DriveMask:=GetLogicalDrives; flag:=1; for Drive := 'A' to 'Z' do begin if (flag and DriveMask)<>0 then begin DriveType := GetDriveType(PChar(Format('%S:\',[Drive]) ) ) ; AItems.Add(Format('%s: %s', [Drive, DriveTypeTexts[DriveType]])); end; flag:=flag shl 1; end; end;
function IsAudioCD(Drive: string): boolean; var FSFlags: DWord; MaxLength: DWord; VolName: String; begin result:=false; if GetDriveType(PChar(drive))=DRIVE_CDROM then begin SetLength(VolName, 64); GetVolumeInformation(PChar(Drive), PChar(VolName), Length(VolName), nil, MaxLength, FSFlags, nil, 0); if lStrCmp(PChar(VolName), 'Audio CD')=0 then result:=true; end; end;
mciSendString('Set cdaudio door open wait', Nil, 0, Handle); mciSendString('Set cdaudio door closed wait', Nil, 0, Handle); das gilt aber nur für das standart cdaudio laufwerk |
CrazyLuke - Di 22.03.05 17:42
Tja, das sagt sich so leicht.
Ich hab ja erst zwei Projekte gemacht, wobei man das erste gar nicht als Projekt bezeichnen kann, das war ja nur ne modifizierte Version aus der Eurorechner-Anleitung des "PC Magazin" (wo die Delhi-Vollversion bei war)...
Und für M.I.B. musste ich ja auch einige Fragen hier rein stellen.
MfG
CrazyLuke
F34r0fTh3D4rk - Di 22.03.05 17:45
das wichtigste ist allerdings noch:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| private procedure WMQueryEndSession (var M: TWMQueryEndSession); message WM_QUERYENDSESSION;
procedure TForm1.WMQueryEndSession (var M: TWMQueryEndSession); begin inherited;
end; |
CrazyLuke - Di 22.03.05 17:47
Gibts zu den ganzen Quellcode-Schnipseln auch noch Erklärungen, was wofür ist (also beim ersten stehts ja schon im Code, aber der zweite?)
MfG
CrazyLuke
F34r0fTh3D4rk - Di 22.03.05 17:49
steht doch da
CrazyLuke - Di 22.03.05 17:50
Ach so, dann muss der Befehl zum Beenden erst kommen? Aha.
Warum postest du das alles? Hast du schon sowas in der Art programmiert oder möchtest du mitmachen? :)
MfG
CrazyLuke
F34r0fTh3D4rk - Di 22.03.05 19:15
ich möchte helfen :D
CrazyLuke - Di 22.03.05 19:22
"Nur" helfen? Also bei M.I.B. hab ich auch "nur" Hilfe von hier und da aus diesem Forum bekommen, daher steht dort nur ein genereller Dank ans Forum drin (also in der Final, in der aktuellen Beta noch nicht). Oder möchtest du explizit erwähnt werden :D
Ich denke, wenn die Funktionen selber nicht so schwer sind, wie du ja auch behauptest, dann wird wohl der Einstellungsbereich noch das Schwierigste werden, denn damit hab ich bisher noch gar nicht gearbeitet. Eigentlich würd ich sowas ungern in der Registry abspeichern, aber dank XP mit den eingeschränkten Benutzerkonten kann ichs ja schlecht in ner INI im Programmpfad speichern (was bei 95/98/ME kein Prob gewesen wäre)...
Naja, ich werd mal ein wenig googlen, was es da für Möglichkeiten gibt.
MfG
CrazyLuke
F34r0fTh3D4rk - Di 22.03.05 19:25
nöö ich möchte net erwähnt werden, der code ist ja auch noch schnippelhaft und der audio cd code muss noch veralgemeinert werden :)
CrazyLuke - Di 22.03.05 19:49
Okay, also kein direkte Partnerschaft. Naja, ich werd sehen wie gut ich vorankomme udn von wem ich alles Hilfe bekomme, dann seh ich weiter mit den Danksagungen im Programm ;)
MfG
CrazyLuke
F34r0fTh3D4rk - Di 22.03.05 19:50
du "kannst" mich erwähnen musst du aber net, war ja jetzt net die groooße hilfe, aber wenn du hilfe brauchst, frag, ist ja schließlich ein gemeinschaftsprojekt ^^
CrazyLuke - Di 22.03.05 20:24
Naja, ich habe es als Gemeinschaftsprojekt vorgeschlasgen. Wenn du dies allerdings schon so bezeichnest, dann muss es ja schon irgendwelche direkten Partner geben?! ;)
Also sobald es sich jemand verdient hat, erwähne ich ihn gerne. Ich werde ja sehen, wie gut ich ins Besondere von dir beraten werde 8)
MfG
CrazyLuke
F34r0fTh3D4rk - Di 22.03.05 20:26
bis jezz ja schonmal net schlecht, oda ?
aber du wirst hier im forum zu deinen fragen viele antworten finden.
warum möchtest du es eigentlich als gemeinschaftsprojekt machen ?
CrazyLuke - Di 22.03.05 20:43
Wie gesagt sind das einige Sachen, die ich wohl anscheinend (wenn du Recht hast...) für schwerer eingeschätzt habe. Nichts desto trotz geht es aber in erster Linie um das Interesse. Aber wenn das Programm sowieso nicht all zu aufwändig ist, dann programmier ich es auch gerne für mich, um in dieser Materie weiter zu kommen.
MfG
CrazyLuke
F34r0fTh3D4rk - Di 22.03.05 20:46
fang doch schon mal an, wenn du nicht weiter weist, frag oder guck im forum ^^
probiers doch erstmal bevor du schon vorher aufgibst ! :)
CrazyLuke - Di 22.03.05 20:52
Ich hab nie behauptet, dass ich aufgebe. Nur wenn es wirklich ein sehr aufwändiges Projekt wäre und es keinen interessiert, dann hab ich da keinen Bock drauf. Dann lieber etwas kleinere Projekte, so dass man mal in alle Bereiche und Fähigkeiten von Delphi reingucken kann :)
MfG
CrazyLuke
F34r0fTh3D4rk - Di 22.03.05 20:53
der bereich windows api ist kein kleiner bereich, damit kann man sich lange beschäftigen... :D
matze.de - Mi 23.03.05 09:01
F34r0fTh3D4rk hat folgendes geschrieben: |
der bereich windows api ist kein kleiner bereich, damit kann man sich lange beschäftigen... :D |
ohhh..ja. *grml*
mfg matze
CrazyLuke - Mi 23.03.05 14:37
Ich werd mir heute abend, wenn ich Zeit hab, mal das Tutorial zu den INI-Dateien durchlesen. Muss ich denn überhaupt noch im "Windows API"-Bereich schauen, ich hab doch jetzt schon den ganzen Code? ;)
MfG
CrazyLuke
F34r0fTh3D4rk - Mi 23.03.05 14:49
ini dateien sind ganz einfach,aber wozu brauchst du sie ? :gruebel:
CrazyLuke - Mi 23.03.05 15:07
Na, irgendwie müssen doch die ganzen Einstellungen gespeichert werden?
MfG
CrazyLuke
F34r0fTh3D4rk - Mi 23.03.05 15:13
registry -> is dafür besser geeignet
CrazyLuke - Mi 23.03.05 15:16
Zitat: |
In die Registry schreiben und aus der Registry lesen
Dazu musst du die Unit registry einbinden.
Wenn du den vielen Leichen in der Registry noch weitere hinzufügen willst, dann verwende die beiden nachfolgenden Prozeduren!
Im Ernst: Selbst gute Deinstallationsprogramme "vergessen" Einträge in der Registry und das System wird immer langsamer.
Das ist vor allem ärgerlich bei Programmen, die man nur vorübergehend mal ausprobiert.
Verwende lieber Ini-Files und schreibe diese in denselben Ordner, in dem sich Dein Programm befindet.
|
http://delphi.zsg-rottenburg.de/faq.html#registry
Dem kann ich voll und ganz zustimmen, deswegen hoffe ich, dass es eine gute Möglichkeit gibt, die INI-Datei so abzuspeichern, dass sie auf allen Systemen funzt. Aber das werd ich nach dem Lesen des Tuts wissen.
MfG
CrazyLuke
F34r0fTh3D4rk - Mi 23.03.05 15:27
naja das dürfte nur ein problem werden wenn man keinen deinstaller hat, und dann wird die ini auch net entfernt, es ist sozusagen wurscht, weil wenn du keinen deinstaller hast bleibt die ini auch auf dem system, und woher soll der user denn das wissen ?
also deshalb ist schonmal ein deinstaller wichtig, und dann kannst du auch ruhig die registry benutzen...
CrazyLuke - Mi 23.03.05 15:37
Gäbs nicht diese blöde Einrichtung vom eingeschränbkten Benutzer bei Windows NT/2000/XP, dann könnte man die INI ja problemlos mit in den Programmordner packen.
Aber eine verwaiste INI-Datei in den Gemeinsamen Dateien (oder wo auch immer man das am Besten hinkopiert) ist mir lieber als ein Ordner mit Dutzenden Einträgen in der Registry...
Dann kommt ein kurzer Hinweis in die Readme und die Leute, die statt des Setups die ZIP runterladen sind auch zufrieden :)
MfG
CrazyLuke
F34r0fTh3D4rk - Mi 23.03.05 15:39
in der registry kann man auch kategorien erstllen, das kann alles gaaaaaaaaaaanz übersichtlich sein, wenn man nur will :D
ini dateien lassen sich leichter manipulieren, deshalb ist das kein nachteil, sondern ein vorteil der registry
CrazyLuke - Mi 23.03.05 15:41
Was soll man denn bitteschön da manipulieren? Solang diesbezüglich keine Gefahr besteht, ziehe ich INIs vor.
MfG
CrazyLuke
F34r0fTh3D4rk - Fr 25.03.05 19:46
so mir war grad langweilig, da hab ich schnell mal was geproggt:
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) private procedure WMQueryEndSession (var M: TWMQueryEndSession); message WM_QUERYENDSESSION; public end;
var Form1: TForm1;
implementation
{$R *.dfm}
function GetCDDrives: string; const DriveTypeTexts: array[DRIVE_UNKNOWN..DRIVE_RAMDISK] of String = ('Unbekannt', 'Kein Wurzelverzeichnis', 'Diskette', 'Festplatte', 'Netzlaufwerk', 'CDROM', 'RAMDisk'); var Drive: Char; DriveType: Integer; DriveMask: Integer; Flag: Integer; begin result:= ''; DriveMask:=GetLogicalDrives; flag:=1; for Drive := 'A' to 'Z' do begin if (flag and DriveMask)<>0 then begin DriveType := GetDriveType(PChar(Format('%S:\',[Drive]) ) ) ; if DriveTypeTexts[DriveType] = 'CDROM' then result:= result + drive; end; flag:=flag shl 1; end; end;
function CDInDrive(Drive: string): boolean; var FSFlags: DWord; MaxLength: DWord; VolName: String; begin result:=false; if GetDriveType(PChar(drive))=DRIVE_CDROM then begin SetLength(VolName, 64); GetVolumeInformation(PChar(Drive), PChar(VolName), Length(VolName), nil, MaxLength, FSFlags, nil, 0); if lStrCmp(PChar(VolName), '') <> 0 then result:=true; end; end;
procedure TForm1.WMQueryEndSession(var M: TWMQueryEndSession); var CDs, CDsIn: string; i: integer; begin inherited; CDs:= GetCDDrives; CDsIn:= ''; for i:= 1 to length(CDs) do if CDInDrive(CDs[i]+':\') then if length(CDsIn) = 0 then CDsIn:= CDs[i]+':\' else CDsIn:= CDsIn + ',' + CDs[i]+':\'; if length(CDsIn) <> 0 then begin beep; if length(CDsIn) = 1 then showmessage('Im Laufwerk "' + CDsIn + '" befindet sich noch eine CD!') else showmessage('In den Laufwerken "' + CDsIn + '" befinden sich noch CDs!'); end; end;
end. |
damit werden die cd-rom laufwerke in denen sich noch cds befinden angezeigt wenn windows beendet wird, das ist doch schonmal was :D
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!