![]() |
Re: Media Center entwickeln
@Ansgar
Die Schaltung zur Selbsthaltung(auf Transitoren basierend) habe ich gerade nicht parat, da müsste ich erst in meinen Schulunterlagen schauen. Es gibt aber auch Selbsthaltungen die rein über ein Relais geschaltet werden. Werde sie mal posten sobald ich sie gefunden habe. Hier mal dargestellt mit einem Schütz ![]() Programmiertechnisch braucht man da nichts zu machen, es ist alles eine reine Hardware Lösung. In der Theorie schaut das in etwa so aus: Das Scütz ist eigentlich nichts weiter als ein Relais. Wird der S2 gedrückt, so schaltet das Schütz und schliesst die Verbindung 13/14. Wird der Taster S2 wieder los gelassen so bleibt die Verbindung zwischen 13/14 weiterhin bestehen solange bis S1 gelöst wird. Denn dann verliert das Relais den Strom und öffnet wieder die Verbindung 13/14. An dem Relais kann man mehr als nur ein Gerät schalten. Es steht mindestens noch ein Schaltkreis zur Verfügung den wir nutzen können. Hieran wird nun die 230V Leitung des PC angeschlossen. Der Tster S1 wird durch einen weiteren Relaiskontakt geschaltet. An S2 wird der so gesehen der IOW angeschlossen, bzw. besser gesagt nur der IR-Empfänger. Wir brauchen nur ein einziges mal einen Spannungsanstieg um das Relais K1 zu schalten. Dazu wird der RC5 Code der Fernbedienung nicht genutzt sondern nur das Positive Datensignal. Liegt also am IR Sensor eine Spannung an so schaltet das Relais durch. Jetzt gibt es 2 Möglichkeiten, die eine ist der PC startet automatisch bei anliegen der Spannung. Die andere Möglichkeit wäre durch erweiterung der Schaltung. Schaltet jetzt der PC ein, so wird durch beispielsweise der Power-Led das Relais was hier S1 darstellt geschlossen und die Selbsthaltung ist aktiv. Schaltet der PC sich ab, die Power-LED erlischt und das Relais öffnet sich wieder, die Selbsthaltung schaltet sich wieder ab. Da PC und die Relais jeweils verzögerungen haben, wird die Schaltung natürlich durch Transistoren und Kondensatoren ersetzt damit genug Zeit bleibt bis der PC wirklich läuft. Kondensatoren sind kleine Energiespeicher. Werden sie Paralell zu den Relais geschaltet werden sie geladen, fällt die Spannung ab so entladen sie sich und liefern noch je nach grösse Spannung um die die Schaltung Temporär zu versorgen damit sichergestellt ist das auch wirklich der PC läuft. Ich hoffe ich konnte dir das so einigermassen erklären. Hier noch ein Schaltbild wie es im groben ausschaut mit den Relais. ![]() So könnte es nachher in etwas aussehen. Da die Schaltung auf 5V ausgelegt wird, kann natürlich der TSOP mit dem IOW im Share stehen. Dazu muss jedoch der IOW ein wenig umgebaut werden, damit dieser unabhängig vom USB auch Spannung bekommt. Zudem könnte man es noch soweit entwickeln das selbst keine Netzversorgung mehr auf dem IOW liegen muss, dieser könnte über einen Akku betrieben werden, dieser lädt sich dann im normal Betrieb wieder auf. @shmia Was ist denn an einem CollectionItem und einer Collection auszusetzen gegenüber der ObjectList? Hier einmal meine Menü Klasse, leider noch mit Fehlern behaftet beim freigeben der Panels.
Delphi-Quellcode:
unit menu_class;
interface uses Classes, Defines, Windows, SysUtils, Controls, Graphics, JvPanel; type TButtonStyle = (etButton, etSeperator, etText); type TMenuEntry = class(TCollectionItem) private FPanel: TJvPanel; FButtonStyle: TButtonStyle; public destructor Destroy(); override; property Button: TJvPanel read FPanel write FPanel; property ButtonStyle: TButtonStyle read FButtonStyle write FButtonStyle; end; type TMenuEntries = class(TCollection) private function GetEntry(Index: Integer): TMenuEntry; public constructor Create; destructor Destroy; override; function Add(AOwner: TWinControl): TMenuEntry; procedure Del(Index: Integer); property MenuEntry[Index: Integer]: TMenuEntry read GetEntry; end; type TMenuManager = class(TObject) private FOwner: TWinControl; FXPos: Integer; FYPos: Integer; FTempYPos: Integer; FMenuEntries: TMenuEntries; FActiveButton: Integer; FItemClick: TNotifyEvent; function GetAcctiveButton: Integer; procedure SetActiveButton(const Value: Integer); procedure OnClick(Sender: TObject); public constructor Create(AOwner: TWinControl; XPos, YPos: Integer); destructor Destroy; override; procedure AddButton(Caption: String; ButtonStyle: TButtonStyle = etButton); procedure RemoveButton(Index: Integer); procedure ClearButtons; function Count: Integer; property ButtonActive: Integer read GetAcctiveButton write SetActiveButton; property OnItemClick: TNotifyEvent read FItemClick write FItemClick; end; implementation { TMenuManager } procedure TMenuManager.AddButton(Caption: String; ButtonStyle: TButtonStyle); var AMenuEntry: TMenuEntry; begin Self.FTempYPos := Self.FMenuEntries.Count * 40 + Self.FYPos; AMenuEntry := Self.FMenuEntries.Add(Self.FOwner); AMenuEntry.FPanel.DoubleBuffered := True; AMenuEntry.FPanel.Left := Self.FXPos; AMenuEntry.FPanel.Top := Self.FTempYPos; AMenuEntry.FPanel.Height := 33; AMenuEntry.FPanel.Width := 233; AMenuEntry.FPanel.Transparent := True; AMenuEntry.FPanel.BevelInner := bvNone; AMenuEntry.FPanel.BevelOuter := bvNone; AMenuEntry.FPanel.Color := clGray; AMenuEntry.FPanel.Alignment := taLeftJustify; AMenuEntry.FPanel.Caption := Caption; AMenuEntry.FPanel.Font.Color := clBlack; AMenuEntry.FPanel.Font.Size := 24; AMenuEntry.FPanel.Font.Style := [fsBold]; if ButtonStyle = etSeperator then AMenuEntry.FPanel.BorderWidth := 0 else AMenuEntry.FPanel.BorderWidth := 1; AMenuEntry.FPanel.Parent := FOwner; AMenuEntry.FPanel.OnClick := Self.OnClick; AMenuEntry.FPanel.Tag := AMenuEntry.Index; AMenuEntry.FButtonStyle := ButtonStyle; end; procedure TMenuManager.ClearButtons; begin while Self.FMenuEntries.Count > 0 do begin Self.FMenuEntries.Del(Self.FMenuEntries.Count -1); end; end; function TMenuManager.Count: Integer; begin Result := Self.FMenuEntries.Count; end; constructor TMenuManager.Create(AOwner: TWinControl; XPos, YPos: Integer); begin inherited Create; Self.FOwner := AOwner; Self.FXPos := XPos; Self.FYPos := YPos; Self.FTempYPos := Self.FYPos; Self.FActiveButton := -1; Self.FMenuEntries := TMenuEntries.Create; end; destructor TMenuManager.Destroy; begin Self.ClearButtons; Self.FMenuEntries.Destroy; inherited Destroy; end; function TMenuManager.GetAcctiveButton: Integer; begin Result := Self.FActiveButton; end; procedure TMenuManager.OnClick(Sender: TObject); begin if Assigned(FItemClick) then begin if Sender is TJvPanel then begin Self.SetActiveButton(TJvPanel(Sender).Tag); //Self.FActiveButton := TJvPanel(Sender).Tag; OnItemClick(Self); // <-- panel existiert nicht mehr end; end; // hier error!!!!!!!!!!!!!!!!! end; procedure TMenuManager.RemoveButton(Index: Integer); begin Self.FMenuEntries.Del(Index); end; procedure TMenuManager.SetActiveButton(const Value: Integer); var AMenuEntry: TMenuEntry; begin if Value = -1 then Exit; AMenuEntry := Self.FMenuEntries.MenuEntry[Value]; if (AMenuEntry <> nil) and (Value <> Self.FActiveButton) then begin if AMenuEntry.ButtonStyle = etButton then begin AMenuEntry.FPanel.Color := clYellow; if Self.FActiveButton > -1 then Self.FMenuEntries.MenuEntry[Self.FActiveButton].FPanel.Color := clGray; Self.FActiveButton := Value; end; end; end; { TMenuEntries } function TMenuEntries.Add(AOwner: TWinControl): TMenuEntry; begin Result := inherited Add as TMenuEntry; Result.FPanel := TJvPanel.Create(AOwner); Result.FPanel.Parent := AOwner; end; constructor TMenuEntries.Create; begin inherited Create(TMenuEntry); end; procedure TMenuEntries.Del(Index: Integer); begin Self.GetEntry(Index).Free; end; destructor TMenuEntries.Destroy; begin inherited Destroy; end; function TMenuEntries.GetEntry(Index: Integer): TMenuEntry; begin Result := inherited Items[Index] as TMenuEntry; end; { TMenuEntry } destructor TMenuEntry.Destroy; begin Self.FPanel.Free; inherited Destroy; end; end. |
Re: Media Center entwickeln
Mal eine kleine Nebenfrage...
Meine Panel besitzen die Eigenschaft OnClick und reagieren auch auf den Click der Fernbedienung. Beim leeren der Menüliste bekomme ich natülich eine AV. Er ist noch in der Procedure drin aber eigentlich existiert das Objekt nicht mehr. Wie könnte ich das umgehen?
Delphi-Quellcode:
mit OnItemClick wird folgendes aufgerufen
procedure TMenuManager.OnClick(Sender: TObject);
begin if Assigned(FItemClick) then begin if Sender is TJvPanel then begin Self.SetActiveButton(TJvPanel(Sender).Tag); //Self.FActiveButton := TJvPanel(Sender).Tag; OnItemClick(Self); // <-- panel existiert nicht mehr end; end; // hier error!!!!!!!!!!!!!!!!! end;
Delphi-Quellcode:
Er springt nachher in das OnClick Ereignis zurück und dort kommt die AV.
procedure TMain_Frm.SelectPressed;
var I: Integer; begin case Self.FCC.PlayerMode of // Hauptmenü pmMain: begin case Self.FMenuManager.ButtonActive of // Musik Menü aktiv setzen 0: begin Self.FOSD.Show('Musik Modus', 2000); Self.FCC.PlayerMode := pmMusik; Self.FMenuManager.ClearButtons; end; // DVD Menü aktiv setzen 1: begin Self.FOSD.Show('DVD Modus', 2000); Self.FCC.PlayerMode := pmDVD; // Self.FMenuManager.ClearButtons; for I := Self.FMenuManager.Count -1 downto 0 do Self.FMenuManager.RemoveButton(I); end; Weiß jemand eine saubere Lösung womit ich sie auch wieder entfernen kann? |
Re: Media Center entwickeln
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
Ist schon etwas her aber ich hatte mal wieder Zeit und hab alles ein wenig umgebaut. Eigentlich habe ich den bisherigen Ansatz komplett über den Haufen geschmissen. Mittlerweile Arbeite ich um die Oberfläche zu erstellen mit Andorra 2D. Bisher sieht es auch noch mehr nach einer Kopie von Media Portal aus aber das ist ja nur ein Skin. Das ist bisher auch nur ein Test. Das komplette System bietet keine Maussteuerung sondern nur über Plugins und Tastatur. Die wesentliche Steuerung soll nur 5 Tasten/Zustände kennen(links, rechts, hoch, runter, auswählen) Beim ersten Versuch hatte ich eigentlich nur das Menü, dort war die steuerung nicht sonderlich schwer. Jetzt habe ich aber neben dem Menü auch noch andere "Buttons". Wie könnte man das am besten programmiertechnisch umsetzen mit den Tasten? Wenn das Menü aktiv ist, kann man mit hoch, runter das Menü steuern. Mit links, rechts sollte man dann von dem Menü auf die anderne "Buttons" kommen, hier wäre das Schliessen, wechsel von Fenster auf Vollbild und Herunterfahren. Hatte persönlich jetzt etwas im Kopf das ich eine Mutterklasse habe TMediaObject von dort aus werden alle anderen Elemente abgeleitet, TMediaMenuObject, TMediaButton, usw. Dann eine Klasse mit einer Liste die alle MediaObjecte beinhaltet und pro Object die Tasten die man nutzen kann und auf das "Nachbar" Object verweisen. Zusätzlich übernimmt die Klasse auch das abfangen der Tastendrücke und leitet sie an das entsprechende Object weiter bzw. von dort zum nächsten. Kleiner Nachteil, es müsste alles im Skin hinterlegt sein... Das ist halt meine Idee, die Frage, ist das ne gute Idee oder gibt es da bessere Lösungen, sofern das überhaupt eine gute Lösung wäre. Gruß Cyberaxx |
Re: Media Center entwickeln
Zitat:
Eine Taste für [Abbrechen] und eine weitere für [Zurück zum Hauptmenü} wären für mich unverzichtbar. Wenn man einem Dreieck noch ein paar/viele Ecken mehr verpasst, könnte sich daraus fast etwas "Rundes" entwickeln, vergleichbar mit einem Rad. Warum von Vorne mit dem Dreieck anfangen? Ist nicht böse, sondern eher fragend gemeint. |
Re: Media Center entwickeln
Hai Cyberaxx,
hänge das Bild bitte als Anhang an deinen Post. Zum einen möchte sich nicht jeder die 40 kB runterladen müssen und zum anderen kann es sein das es irgendwann nicht mehr auf dem Server liegt und dann sieht das ganze nicht mehr "schön" aus. Danke. |
Re: Media Center entwickeln
Das es keine Mausunterstützung hat ja seinen Sinn, für mich zumindest. Es läuft ausschliesslich auf dem TV, ich sitz auf der Couch und da habe ich sicher keine Lust mit der Maus zu spielen. Ich habe also meist nur eine Fernbedienung. Da ich die Maussteuerung eh selber umsetzen müßte wird sie nicht mit eingebaut. Ich denke mal wenn es soweit ist könnte man dies über ein Plugin lösen.
Zitat:
haben ja nichts mit der Objektsteuerung zu tun sondern sind an die "Form" gebunden. |
Re: Media Center entwickeln
hört sich ziemlich interessant an!
kannst du mal die sourcen hochladen! dann kann man sich mehr darunter vorstellen? idee und design find ich super! mfg |
Re: Media Center entwickeln
Naja das Design ist ein wenig von Media Portal abgeschaut.
Da ich mit der 3D Umsetzung noch nicht zufrieden bin gibt es da leider noch nicht viel was man hochladen könnte, ich sitze gerade daran das ich die Menüsteuerung hinbekomme ohne Maus. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz