messagebox który sam się zamyka po czasie np 3 sek

0

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.

0

Bo nie chce otwierać do tego formatki.
No to chyba nie masz wyboru...

0

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;

0

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

0

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.

3

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;
0

@_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;

0

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ę?

0

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.

0

Dziękuje za podpowiedź. Teraz działa jak trzeba.

1 użytkowników online, w tym zalogowanych: 0, gości: 1