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 user profile iconAXMD: 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:
//Laufwerke auflisten (können ja mehere sein)
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;

//ist ne audio cd im laufwerk ? <- lässt sich bearbeiten
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, nil0);
    if lStrCmp(PChar(VolName), 'Audio CD')=0 then result:=true;
  end;
end;

//öffnen
mciSendString('Set cdaudio door open wait'Nil0, Handle);
//schließen
mciSendString('Set cdaudio door closed wait'Nil0, 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;
{ Hier befindet sich der Quellcode, der ausgeführt werden soll
  wenn Windows beendet werden soll }

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

Zitat:


Delphi-Quelltext
1:
2:
{ Hier befindet sich der Quellcode, der ausgeführt werden soll  
  wenn Windows beendet werden soll }


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

user profile iconF34r0fTh3D4rk 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
    { Public-Deklarationen }
  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, nil0);
    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


F34r0fTh3D4rk - Fr 01.04.05 18:41

http://www.swissdelphicenter.ch/de/showcode.php?id=124

das ist besser zum laufwerk öffnen und schließen, da man die laufwerke auswählen kann :D


CrazyLuke - Do 21.07.05 22:15

Da das Programmieren nur ein kleines Hobby ist und ich nicht die Zeit habe, mich eingehend damit zu beschäftigen, werde ich dieses Projekt wohl jetzt aufgeben, um mich - zumindest erst einmal - auf Musik-Industrie-Befreiung [http://www.delphi-forum.de/topic_MIB++MusikIndustrieBefreiung+03+Beta_25184.html] konzentrieren zu können.

Hiermit stelle ich meine bisherige Arbeit zur Verfügung, es handelt sich dabei um die reine Oberfläche (im Delphi 2005 Personal Win32-Format). Okay, es ist kein Jahrhundertprtojekt, aber wenn es jemanden interessieren würde, wäre es schön, wenn diese Funktionen ebenfalls mit eingebaut werden könnten...

user defined image

user defined image

:arrow: Download [http://free.pages.at/djiltiz/sde.zip]


MfG
CrazyLuke