Jak zrobić komunikat taki jak messagebox który nie ma buttonów ok.... I sam się zamyka po chwili np 3 sekundy. Bo nie chce otwierać do tego formatki.
Lub może ktoś zna inna funkcję która to realizuje i jest dostępna w delphi.
Bo nie chce otwierać do tego formatki.
No to chyba nie masz wyboru...
Jak zrobić komunikat taki jak messagebox który nie ma buttonów ok.... I sam się zamyka po chwili np 3 sekundy.
On ma najwyżej jeden przycisk Ok
; Poczytaj o podstawach tworzenia własnych okien dialogowych - w pierwszej części opisuję sposób na stworzenie własnego okna MessageBox
, w którym wystarczy w metodzie Execute
albo uruchomić TTimer
, albo ręcznie odliczać w pętli i zwracać kontrolę dzięki Application.ProcessMessages
; Poczytaj, to nic trudnego;
Lub może ktoś zna inna funkcję która to realizuje i jest dostępna w delphi.
Nie ma takiej funkcji, więc albo skorzystasz z funkcji MessageBox
, albo utworzysz własne okno dialogowe, które oprogramujesz dla własnych potrzeb;
Możnaby pokombinować i funkcjami WinAPI znaleźć uchwyt okna powiadomienia i je zamknąć, ale musiałbyś trochę poczytać na ten temat; Możesz też wykorzystać albo swoją implementację, albo gotowe kontrolki do dymków; Jednak nie napisałeś zbyt wiele, więc nie wiem jaka forma miałaby być tej informacji;
A tak poza tym - MessageBox
także otwiera formularz;
procedure TForm1.AlertMessageClick(Sender:TObject);
begin
TJvDesktopAlert(Sender).Close(true);
end;
Alert:=TJvDesktopAlert.Create;
Alert.MessageText:='Masz nową wiadomość';
Alert.OnMessageClick:=AlertMessageClick;
Alert.StyleOptions.DisplayDuration:=3000;
Alert.Execute;
Jedi library
W załączniku przykładowy kod w WinAPI. Wszystkie potrzebne pliki plus exek są dołączone. Kompiluje się to bez problemów pod Delphi 7. Sposób z wysłaniem własnego komunikatu WM_CHANGEMSGBOX
przez PostMessage znalazłem kiedyś szukając informacji w google jak podmienić etykiety przycisków aby klawisze "Tak" lub "Nie' i tym podobne były z innymi etykietami niż te w języku systemu. W razie pytan pisz, ale myślę że wszystko powinno być jasne. Pod VCL również mozesz to zastosowac tylko wtedy funkcją SetWndProc
musisz ustawić funkcję obsługi komunikatów dla TwojaFormatka.Handle
i AppHandle to będzie raczej również ten sam Handle co dla formatki. Albo możesz też zadeklarować funkcję ze słowem kluczowym message WM_CHANGEMSGBOX
i w niej obslużyć te zdarzenie. I wiem, że trochę brzydko wygląda pod Windows 7 białe pole nie na całe okienko (bo nie ma przycisków), ale to już sobie sam dopasuj. Możesz na sztywno ustalić wielkośc takiego okienka i ustawić jego rozmiar przez SetWindowPos
. Więcej informacji masz oczywiście w Goole i na MSDNie.
Może np tak:
procedure AsyncMessage(const Text:String;Time:Integer);
var Msg:TForm;
var Tm:TTimer;
var CloseProc:procedure of object;
var CloseMethod:TMethod;
begin
Msg:=CreateMessageDialog(Text,mtInformation,[]);
Tm:=TTimer.Create(Msg);
Tm.Interval:=Time;
CloseProc:=Msg.Close;
CloseMethod:=TMethod(CloseProc);
Tm.OnTimer:=TNotifyEvent(CloseMethod);
Msg.Show;
end;
@_13th_Dragon napisał o Jedi, @olesio w swoim WinAPI, to i ja dorzucę coś od siebie :]
W załączniku masz prosty program, w którym przedstawiłem sposób tworzenia własnego okna dialogowego mogącego zwracać wartość dowolnego typu, nie tylko prostych; Takie rozwiązanie wykorzystuję we własnych projektach do przeróżnych okien dialogowych, które zwracają różne wartości, jak listy (TStrings
), rekordy czy obiekty własnych klas; Wykorzystanie jest bardzo proste - wystarczy stworzyć własną klasę dialogu w module formularza, który będzie okienkiem dialogowym; Dodatkowo trzeba napisać własne zdarzenie OnClose
i to w nim przepisywać informacje zwracane z pól formularza do pól klasy dialogu - wszystko opisałem w komentarzach; Ustawianie wartości pól formularza (które później zostaną przepisane do pól klasy) należy zawrzeć w zdarzeniach formularza, np. po kliknięciu jakiegoś przycisku; Jeśli potrzebujesz to zabezpiecz okno przed przedwczesnym zamknięciem przez użytkownika;
Dziękuje wszystkim. Po prostu kawa na ławę prościej się nie dało. Jestem wdzięczny...
wybrałem metode...
procedure AsyncMessage(const Text:String;Time:Integer);
var Msg:TForm;
var Tm:TTimer;
var CloseProc:procedure of object;
var CloseMethod:TMethod;
begin
Msg:=CreateMessageDialog(Text,mtInformation,[]);
Tm:=TTimer.Create(Msg);
Tm.Interval:=Time;
CloseProc:=Msg.Close;
CloseMethod:=TMethod(CloseProc);
Tm.OnTimer:=TNotifyEvent(CloseMethod);
Msg.Show;
end;
tylko tam gdzie jest mtInformation wpisałem, żeby było mtcustom i wtedy na górze formatki messagedialog wyświetla nazwę głównej formatki. Jak wpisać tam dowolną nazwę?
Ech, ręce opadają. Zero samodzielnego myślenia. Zainstaluj sobie TBrain. A co do "problemu" - to pomyśl chwilę i zobacz jakiego typu jest zmienna Msg
. Masz odpowiedź na swoje banalne pytanie.
Dziękuje za podpowiedź. Teraz działa jak trzeba.