Historia w przeglądarce - problem z tworzeniem

0

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?

0

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

0

Tylko, że to ma być w ListBoxie otwarte i nie wiem jak to zrobić...

0

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

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ą.

0

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

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

0

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.

0

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...

0

Ok, działa dzięki :P

0

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

0

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

0

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ć...

0

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.

0

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...

0

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.

0

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

0

Zmienić mu Width w zdarzeniu OnResize dla formatki.

0

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...

0

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.

0

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...

0

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;

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