Mam taki kod:
procedure TTajfun.FormCreate(Sender: TObject);
begin
HistoriaOkno.Items.LoadFromFile('history.txt');
end;
i potrzebuję zrobić, że jeśli go nie ma to zostaje on utworzony - jak zamienić kod?
Mam taki kod:
procedure TTajfun.FormCreate(Sender: TObject);
begin
HistoriaOkno.Items.LoadFromFile('history.txt');
end;
i potrzebuję zrobić, że jeśli go nie ma to zostaje on utworzony - jak zamienić kod?
Przeczytać coś na temat obsługi plików w delphi? Np. Praca z plikami. No skoro Adam się męczył, żeby to napisać, to może warto? I np. zwrócić uwagę na FileExists
Tylko, że to ma być w ListBoxie otwarte i nie wiem jak to zrobić...
Noż... jeśli plik istnieje, to ładujesz go do listbox'a, jeśli nie istnieje to nic nie robisz (bo i po co). Jak coś dodasz, to po prostu go nadpisujesz...
if FileExists(ExtractFilePath(Application.Exename) + 'history.txt') then
HistoriaOkno.Items.LoadFromFile(ExtractFilePath(Application.Exename) + 'history.txt');
Ok, działa, wielkie, wielkie dzięki.
@Troszkę OT, ale nie chcę robić nowego tematu. Czy można dać jakiś button na ListBoxa, który umożliwi jego zamknięcie(i żeby się przemieszczał i pojawiał razem z Historią.
Da się. Różne są sposoby, ale skoro masz takie problemy jak znalezienie informacji o FileExists, to nie wiem co Ci łatwego doradzić, żeby nie "rodziło to" kolejnych 1000 pytan. Może najprościej umieść w pobliżu button tego ListBoxa button i w OnClick daj kod w poniższym stylu (o ile sam Button ma zostać):
ListBox1.Visible := not ListBox1.Visible;
Właśnie chodziło o to, żeby pojawiał się i znikał wraz z Historią. Na chwilę obecną próbuję to zrobić nie buttonem a włączaniem i wyłączaniem w Menu(wiem jak mniej więcej za button się zabrać). Taki mam kod(co prawda na ulubione, ale przy historii niczym się prawie nie będzie różnić)
procedure TTajfun.UlubioneMenuClick(Sender: TObject);
begin
if UlubioneOkno.Visible:=False(UlubioneOkno.Visible:=True) then
UlubioneOkno.Visible:=True(UlubioneOkno.Visible:=False);
end;
Niestety wywala ten kod błędy:
[Error] Unit1.pas(233): Missing operator or semicolon
[Error] Unit1.pas(233): Type of expression must be BOOLEAN
[Error] Unit1.pas(234): Missing operator or semicolon
[Fatal Error] Tajfun1.dpr(6): Could not compile used unit 'Unit1.pas'
Próbowałem też zastosować kod z Boolean
procedure TTajfun.UlubioneMenuClick(Sender: TObject);
begin
if UlubioneOkno.Visible:=0(UlubioneOkno.Visible:=1) then
UlubioneOkno.Visible:=1(UlubioneOkno.Visible:=0);
end;
i są takie błędy:
[Error] Unit1.pas(233): Missing operator or semicolon
[Error] Unit1.pas(233): Incompatible types: 'Boolean' and 'Integer'
[Error] Unit1.pas(234): Missing operator or semicolon
[Error] Unit1.pas(234): Incompatible types: 'Boolean' and 'Integer'
[Fatal Error] Tajfun1.dpr(6): Could not compile used unit 'Unit1.pas'
Co z tym zrobić?
Ale Ty uparty jesteś. Nie wiem co kombinujesz z tymi if'ami i jak sobie założyłeś, jak to ma działac. Najlepiej zacznij od prostszych programów i ogarnij najpierw podstawy. Przecież doradziłem Tobie, zrób:
UlubioneOkno.Visible := not UlubioneOkno.Visible;
A jak coś porównujesz if'ami to operatorem porównania jest = lub < lub > albo w przypadku zrobiorów in. W ogóle nie rozumiem co chcesz osiągnąc tą konstrukcją. Obowiązkowa lektura dla Ciebie to te strony: If Operatory języka i musisz myśleć co piszesz, a nie wymyślac, jakąś nową składnie.
Z ifem chodziło mi o to, że kliknięcie na pozycję w Menu wyświetli/wyłączy historię w zależności od obecnego bytu...
Ok, działa dzięki :P
Sorka, że w nowym poście, ale jeśli ktoś, kto może mi pomóc już to przeczytał, to nie zobaczy zmian...
Dodałem czyszczenie Historii. Niby wszystko jest ok, ale jeśli wybiorę czyszczenie, które jest w Narzędzia->Historia->Wyczyść, a HistoriaOkno jest otwarta, to po najechaniu na nią w celu jej rozwinięcia HistoriaOkno znika... Co zrobić?
I jeszcze jedno: Dodałem przycisk dodawania stron do ulubionych - jednak chcę, by sprawdzał, czy jest już dodana i jeśli jest usuwał ją. I jeszcze - chcę zrobić, żeby wpisy w Historii się nie dublowały - jak to opanować?
Obiekty z elementami klasy TStrings jak TListBox mają taką metodę jak IndexOf(Tekst) sprawdza ona elemety bez względu na wielkośc liter i jeżeli IndexOf(Text) zwraca -1 to znaczy, że na liście nie ma elementu o takiej etykiecie. A co do znikania jakiś tam okien to pokaż kod jak je czyścisz, z fusów nic nie wywróżymy, a żadnego kodu do tego nie widzę. A i na prawdę polecam najpierw ogarnąc podstawy, a później brać się za pisanie czegoś bardziej zaawansowanego, bo widać, że to Ciebie przerasta ;/
Czyszczenie Historii to po prostu:
procedure TTajfun.HistCzyszClick(Sender: TObject);
begin
HistoriaOkno.Items.Clear;
HistoriaOkno.Items.SaveToFile('historia.tfn');
end;
Więc nic nie powinno zamykać okna historii, a je zamyka...
PS Kod pisany samodzielnie :D(znam funkcję czyszczenia).
Zresztą NAJECHANIE na przycisk nie powinno nic robić...
Jak "najechanie" na przycisk coś Ci robi to znaczy, że pewnie masz jeszcze jakiś kod w zdarzeniu OnMouseMove. Przejrzyj zdarzenia dla tego ListBoxa. Powyższy kod, ktory wkleiłeś na pewno nie ukrywa ListBoxa - tylko czyści zawarte w nim elementy i zapisuje do pliku jego zawartość. A i jak zapis ma nastapić do katalogu gdzie jest exe to ja bym to robił z dodaniem zmiennej na przyklad APath := ExtractFilePath(Application.ExeName), bo o ile się orientuje zapis bez podania ściezki w niektorych sytuacjach może zapisać w katalogu z "Rozpocznij w" w ewentualnym skrócie albo jak ktoś sie uprze i pod TotalCommanderem wrzuci Twój exe na przykład na D:\ a uruchomi z wiersza poleceń z katalogu C:\ w panelu D:\nazwa_pliku.exe to plik zapisze się do C:. Wiem, że mało osób o takich rzeczach myśli, ale jak już coś kodzisz to rób to dobrze i przewiduj ewentualne warianty. Oczywiście pod nowszymi systemami lepiej zapisywać do stworzonego podkatalogu w %AppData%, bo większośc ma włączone UAC.
Zapamiętam na przyszłość, ale zmienię to później. W OnMouseMove ani Formy, ani ListBox'a. Zauważyłem też, że te najechaniu gdy Historia jest zamknięta - otwiera ją...
W kodzie nic nie znalazłem co mogłoby powodować takie działania...
Coś musi być w kodzie, no chyba, że masz Windows 7 i włączoną kompozycję inną niż klasyczny styl jak w XP "bez bajerów", to cyrki ze znikaniem komponentow mogą się dziać przy naciśnięciu Alta, o ile Twoja aplikacja posiada niestadardowy manifest. Pomaga na to moduł vistaaltfix.pas do wygooglowania. Jednak nie spotkałem się żeby coś pod Delphi 7 samo znikało w innych przypadkach, jeżeli nie ma tego w kodzie.
Mam Win 7 z Aero(włączonym). Klikałem kilka razy Alta i sprawdzałem, jednak bez zmian...
Przy Ulubionych tak się nie dzieje(przy czym nie są one rozwijalnym Menu jak w przypadku Historii)
Jeszcze jedno - jak zrobić, by wraz z rozszerzaniem przeglądarki Edit się rozszerzał?
Zmienić mu Width w zdarzeniu OnResize dla formatki.
A jak to zrobić, bo wartości procentowe nie działają...
I jak przesuwać przyciski wraz ze zmianą szerokości? Szukałem, ale tu na 4programmers są tego 33 strony...
Height, Left, Width, Top to nie wartości procentowe tylko całkowite typu integer. Ustawiaj je w zależności od tego jak mają się ułożyć komponenty. Ech, już Tobie jedna osoba pisała w innym temacie. Ogarnij najpierw podstawy, bo cały program piszemy za Ciebie, a Ty nadal masz 1000 pytan do... Zobacz kod dołaczony do tego posta. Powinieneś załapac ideę. I trochę samodzielności. Pokombinuj najpierw chociaż sam, bo ja też rozumiem dział Newbie - czyjeś początki, ale Ty co chwile generujesz sam sobie problemy, których byś uniknąl najpierw spokojnie zaczynając od nauki podstaw i napisania czegoś prostszego.
Kod w miarę przystosowałem, wielkie dzięki. Szkoda tylko, że w Delphi nie ma właściwości prawo(przejrzałem właściwości). No, ale cóż, trudno...
A po co w Tobie własność "Prawo"? Przeciez za pomoca Left i Top da się wszystko ustawić. Jeżeli masz na przykład GroupBoxa a na nim ScrollBar i po jego prawej Label do wypisywania wartości, ktora może być duża i zmiennej szerokości (oczywiście Label musi mieć AutoSize ustawione na True), to mozna zrobić tak:
procedure TMainForm.RedTimeSBChange(Sender : TObject);
var
GB : TGroupBox;
SB : TScrollBar;
ALabel : TLabel;
FreeAreaLeft, FreeAreaWidht : Word;
begin
GB := LightsTimeGB;
SB := TScrollBar(Sender);
ALabel := RedTimeLabel;
ALabel.Caption := IntToStr(SB.Position);
FreeAreaLeft := SB.Left + SB.Width;
FreeAreaWidht := GB.Width - FreeAreaLeft;
ALabel.Left := FreeAreaLeft + (FreeAreaWidht - ALabel.Width) div 2;
//...
end;