Ĺadny brzuch
Wybaczcie że zakładam tyle tematów, ale mam kolejny problem - jak przenieć label np. 2 linijki w dół, po prostu zmienic jego pozycje wzgledem osi x
cytat:Slighter napisał:
Wybaczcie że zakładam tyle tematów, ale mam kolejny problem - jak przenieć label np. 2 linijki w dół, po prostu zmienic jego pozycje wzgledem osi x
Nie bardzo rozumiem...
Chodzi Ci o położenie Labela na formie ?
Jeśli tak to określa to jego właściwość Top.
| GG:5365367 | ICQ:245363570 |
A może w zdarzeniu najechaniu myszką wpisz label1.top := label1.top +2
nie wiem czy to zadziała bo niesprawdzałem
TRATAT
cytat:radekw1988 napisał:
A może w zdarzeniu najechaniu myszką wpisz label1.top := label1.top +2
nie wiem czy to zadziała bo niesprawdzałem
TRATAT
Lub to co niżej (wtedy skok będzie o wysokość label'a)
Label1->Top += Label1->Height;
Mam nadzieję, że dobrze to zapisałem - jak nie to niech jakiś C'owiec mnie poprawi ;)
| GG:5365367 | ICQ:245363570 |
Zdaje się, że Oxi dobrze napisał, zresztą jak zwykle... ;)
______________________________________
Pozdrawiam,
mg
zajrzyj na http://www.compzone.up.pl/
Dzięki, właśnie o to mi chodziło.
hm, a jak rozwiązalibyście taki problem: nie znam liczby labeli jakie mam stworzyć bo są one zapisane w zmiennej której wartość w trakcie działania programu ulega zmienie, więc jak mam wyświetlić te labele?
cytat:Slighter napisał:
hm, a jak rozwiązalibyście taki problem: nie znam liczby labeli jakie mam stworzyć bo są one zapisane w zmiennej której wartość w trakcie działania programu ulega zmienie, więc jak mam wyświetlić te labele?
Możesz zastosować dynamiczną tablicę obiektów TLabel, której wielkość możesz sobie dowolnie ustalać podczas działania programu. Do poszczególnych Labeli będziesz się mógł wtedy odwoływać tak jak do tablicy, np. Label[1], Label[2] itd.
Gdy będziesz chciał stworzyć x Labeli - będziesz mógł to zrobić sobie w pętli.
| GG:5365367 | ICQ:245363570 |
hmm, coś takiego?
for (int i=0; i<pewna_liczba; i++)
{
Label[i]->Top=10+i;
}
a jak zainistować tą dynamiczną tablicę TLabel? new TLabel[pewna_liczba]? aha no i jak je wyświetlać bo na razie przecież są tylko utworzone?
cytat:Slighter napisał:
hmm, coś takiego?
[...]
W Delphi wyglądało by to tak:
SetLength(LabelTab, ile_labeli); for j:=0 to ile_lebeli-1 do begin LabelTab[j] := TLabel.Create(Self); LabelTab[j].Top := 10 + j * 20; [i]{ pozostałe właściwości tego Labela - left, caption itp }[/i] end;
Przy czym LabelTab jest zadeklarowane tak: LabelTab : array of TLabel;
Co do Buildera to nie mam go zainstalowanego i właściwie w nim nie pisze - więc podam Ci tylko jak by to mogło wyglądać w przybliżeniu - potestuj sobie:
SetLength(LabelTab, ile_labeli); for (int j=0; j<ile_labeli; j++) { Label[j]->Create(Self); Label[j]->Top = 10 + j * 20; [i]{ pozostałe właściwości tego Labela - left, caption itp }[/i] }
| GG:5365367 | ICQ:245363570 |
niestety przy deklaracji tablicy zgłasza błąd :-(
cytat:Slighter napisał:
niestety przy deklaracji tablicy zgłasza błąd :-(
Napisz jak ją deklarujesz - i jaki zgłasza błąd, bo bez tego ciężko domyślić się o co chodzi.
| GG:5365367 | ICQ:245363570 |
znaczy deklaruje ją tak jak napisałeś: LabelTab : array of TLabel;
i zgłasza syntax declaration error
cytat:Slighter napisał:
znaczy deklaruje ją tak jak napisałeś: LabelTab : array of TLabel;
i zgłasza syntax declaration error
To musi zgłaszać błąd - bo to jest deklaracja używana w ObjectPascalu.
Niestety nie wiem jak deklaruje się tablice dynamiczne w C++ - musisz zaczekać aż zajrzy tu ktoś kto pisze w tym języku.
| GG:5365367 | ICQ:245363570 |
no właśnie od początku użykowania C++ Builder zastanawiałem się jak buduje się te tablice zawierające takie komponenty jak Label, a w między czasie nie wiesz przypadkiem dlaczego wyświetla mi błąd (Undefinited Sybmol 'TIniFile')? Przecież ten komponent chyba jest w podstawowej zawartości Buildera (pisze o nim w Helpie i nawet w Ekspercie). Ten fragment w którym chciałem go uzyć wygląda tak:
TIniFile *ini;
ini = new TIniFile( ChangeFileExt( Application->ExeName, ".INI" ) );
powyższy problem już się rozwiązał - trzeba było dołączyć IniFiles.hpp, ale jest już kolejny - nie wiecie skąd ściągnąc komponent TStrings?
cytat:Slighter napisał:
nie wiecie skąd ściągnąc komponent TStrings?
Jesteś pewien, że chodzi Ci o komponent a nie o klasę TStrings ?
| GG:5365367 | ICQ:245363570 |
A jeśli o klasę?
cytat:Slighter napisał:
A jeśli o klasę?
To już ją masz w Builderze - nic nie musisz ściągać.
Możesz sobie deklarować zmienne tego typu.
| GG:5365367 | ICQ:245363570 |
racja program działa...ale w momencie gdy przechodzi do tego fragmentu: RichEdit1->Lines->AddStrings(napis); wyskakuje błąd:
Project chat.exe raised exception class EAccessViolation 'Access violation at address 4002BD57 in module 'rtl60.bpl'. Read of address 00000008'. Process stopped. Use Step or Run to continue.
????????????
cytat:Slighter napisał:
????????????
Pewnie zadeklarowałeś zmienną napis jako TStrings ale jej nie utworzyłeś.
A tak w ogóle to co chcesz osiągnąć ?
Jeśli chcesz dodać do RichEdit'a jakąś linijkę to może to Ci wystarczy:
RichEdit1->Lines->Add(napis);
gdzie napis jest po prostu tekstem jaki chcesz dodać do RichEdit'a.
| GG:5365367 | ICQ:245363570 |
niestety muszę zkorzystać z ini->ReadSection, które potrzebuje TStrings, bo ini->ReadString czyta chyba tylko jedną linijkę np.
1: //to czyta
//a tego już nie
2:
A o co chodzi z tym nie utworzeniem?
cytat:Slighter napisał:
niestety muszę zkorzystać z ini->ReadSection, które potrzebuje TStrings, bo ini->ReadString czyta chyba tylko jedną linijkę np.
Skoro chcesz to załadować do RichEdita to może po prostu:
ini->ReadSection('Jakaś sekcja', RichEdit1->Lines)
| GG:5365367 | ICQ:245363570 |
a zapomniałem że TStrings potrzebne mi jest do funkcji AddStrings() -czyli co mam zrobić
cytat:Oxi napisał:
Pewnie zadeklarowałeś zmienną napis jako TStrings ale jej nie utworzyłeś.
O co ci chodziłio, że jej nie utworzyłem? bo gdy wpisuje: TStrings *napis = new TStrings; to wyświetla mi błędy E2352 i E2353?
cytat:Slighter napisał:
O co ci chodziłio, że jej nie utworzyłem?
Chodziło mi o takie coś:
zmienna := Typ.Create;
[...]
zmienna.Free;
Co do Twojego problemu to jeśli użycie zmiennej typu TStrings jest konieczne to zastosuj typ TStringList (jest to klasa pochodna od TStrings). Bo samo TStrings jest klasą abstrakcyjną i do Twoich celów się nie nadaje.
Poniżej przykładowy kod tworzący TStringList i zwalniający po nim pamięć:
lista := TStringList.Create; try [i][...][/i] finally lista.Free; end;
gdzie lista jest typu TStringList
Kontakt - GG:5365367 / ICQ:245363570
(tylko w sprawach prywatnych - inne pytania proszę zadawać na Forum)
Dzięki Oxi kod jest dobry ale myślę poszłem złą drogą - może spróbuję sformułować o co właściwie mi chodzi: chcę zapisywać gdzieś tekst który mieści się w kilku linijkach - jaki jest najlepszy na to sposób, czy ini to właściwe wyjście?
Naprawdę nie ma żadnego pomysłu? - wybaczcie że się tak narzucam ale to bardzo ważne, a siedzę nad tym od kilku dni i nic. Chodzi po prostu o to, że chcę wprowadzić archiwum w którym przechowywane były by wszystkie notki i żeby po wyłączeniu programu dalej tam były - ini->ReadString czyta tylko pierwszą linijkę z kluczem np. 1=cośtam. Co mam teraz zrobić, gdzie przechowywać ten text?
cytat:Slighter napisał:
Dzięki Oxi kod jest dobry ale myślę poszłem złą drogą - może spróbuję sformułować o co właściwie mi chodzi: chcę zapisywać gdzieś tekst który mieści się w kilku linijkach - jaki jest najlepszy na to sposób, czy ini to właściwe wyjście?
Slighter - opisz dokładnie co chcesz zapisywać - tzn, czy ma to być tylko kilka linijek czy też jakaś ilość kilku linijkowych informacji (np. 15 kilkulinijkowych notatek).
Kontakt - GG:5365367 / ICQ:245363570
(tylko w sprawach prywatnych - inne pytania proszę zadawać na Forum)
ta druga wersja - chce zrobić coś takiego jak archiwum w gg - wychodzisz z okienka rozmowy, a program dodaje ją do archiwum, nie wiem ile będzie tych rozmów na pewno mieścić się będą w kilku linijkach
cytat:Slighter napisał:
ta druga wersja - chce zrobić coś takiego jak archiwum w gg - wychodzisz z okienka rozmowy, a program dodaje ją do archiwum, nie wiem ile będzie tych rozmów na pewno mieścić się będą w kilku linijkach
W typ przypadku proponowałbym do tego zwykły plik tekstowy.
Do dodawania nowych wpisów dobrze nadaje się otworzenie pliku do zapisu poprzez Append - wtedy zostanie ustawiona pozycja na końcu pliku i będzie można dopisywać nowe dane bez utraty starych.
Podczas zapisu możesz dodawać dodatkowo np datę czy godzinę i co tam Ci się jeszcze podoba. Wszystko to będziesz mógł wykorzystać przy odczycie do odpowiedniego sformatowania wyglądu archiwum.
Przy odczycie otwórz plik za pomocą Reset.
Zapis: AssignFile(plik, 'archiwum.dat'); Append(plik); try [i]{ tu zapisujesz co chcesz }[/i] finally CloseFile(plik); end;
Odczyt: AssignFile(plik, 'archiwum.dat'); Reset(plik); try [i]{ tu odczytujesz co chcesz }[/i] finally CloseFile(plik); end;
W obu przypadkach zmienna plik jest typu TextFile.
Do odczytu używasz Readln (lub Read) a do zapisu Writeln (lub Write).
Kontakt - GG:5365367 / ICQ:245363570
(tylko w sprawach prywatnych - inne pytania proszę zadawać na Forum)
niestety wogóle nie znajduje mi tej funkcji AssignFile - prawdopobonie nie ma w C++ Builder, ale przypomniało mi się że jest w C++ podobna metoda do zrobienia tego - trzeba będzie zajrzeć do Symfonii i sobie przybomnieć, jak się uda to poinformuje.
cytat:Slighter napisał:
niestety wogóle nie znajduje mi tej funkcji AssignFile - prawdopobonie nie ma w C++ Builder, ale przypomniało mi się że jest w C++ podobna metoda do zrobienia tego - trzeba będzie zajrzeć do Symfonii i sobie przybomnieć, jak się uda to poinformuje.
No racja - może tego nie być w Builderze, cały czas opierałem się na podobieństwach Delphi i Buildera - ale oczywiście nie wszystko jest tak samo.
Kontakt - GG:5365367 / ICQ:245363570
(tylko w sprawach prywatnych - inne pytania proszę zadawać na Forum)
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
cytat:Slighter napisał:
Wybaczcie że zakładam tyle tematów, ale mam kolejny problem - jak przenieć label np. 2 linijki w dół, po prostu zmienic jego pozycje wzgledem osi x
Nie bardzo rozumiem...
Chodzi Ci o położenie Labela na formie ?
Jeśli tak to określa to jego właściwość Top.
| GG:5365367 | ICQ:245363570 |
A może w zdarzeniu najechaniu myszką wpisz label1.top := label1.top +2
nie wiem czy to zadziała bo niesprawdzałem
TRATAT
cytat:radekw1988 napisał:
A może w zdarzeniu najechaniu myszką wpisz label1.top := label1.top +2
nie wiem czy to zadziała bo niesprawdzałem
TRATAT
Lub to co niżej (wtedy skok będzie o wysokość label'a)
Label1->Top += Label1->Height;
Mam nadzieję, że dobrze to zapisałem - jak nie to niech jakiś C'owiec mnie poprawi ;)
| GG:5365367 | ICQ:245363570 |
Zdaje się, że Oxi dobrze napisał, zresztą jak zwykle... ;)
______________________________________
Pozdrawiam,
mg
zajrzyj na http://www.compzone.up.pl/
Dzięki, właśnie o to mi chodziło.
hm, a jak rozwiązalibyście taki problem: nie znam liczby labeli jakie mam stworzyć bo są one zapisane w zmiennej której wartość w trakcie działania programu ulega zmienie, więc jak mam wyświetlić te labele?
cytat:Slighter napisał:
hm, a jak rozwiązalibyście taki problem: nie znam liczby labeli jakie mam stworzyć bo są one zapisane w zmiennej której wartość w trakcie działania programu ulega zmienie, więc jak mam wyświetlić te labele?
Możesz zastosować dynamiczną tablicę obiektów TLabel, której wielkość możesz sobie dowolnie ustalać podczas działania programu. Do poszczególnych Labeli będziesz się mógł wtedy odwoływać tak jak do tablicy, np. Label[1], Label[2] itd.
Gdy będziesz chciał stworzyć x Labeli - będziesz mógł to zrobić sobie w pętli.
| GG:5365367 | ICQ:245363570 |
hmm, coś takiego?
for (int i=0; i<pewna_liczba; i++)
{
Label[i]->Top=10+i;
}
a jak zainistować tą dynamiczną tablicę TLabel? new TLabel[pewna_liczba]? aha no i jak je wyświetlać bo na razie przecież są tylko utworzone?
cytat:Slighter napisał:
hmm, coś takiego?
[...]
W Delphi wyglądało by to tak:
SetLength(LabelTab, ile_labeli); for j:=0 to ile_lebeli-1 do begin LabelTab[j] := TLabel.Create(Self); LabelTab[j].Top := 10 + j * 20; [i]{ pozostałe właściwości tego Labela - left, caption itp }[/i] end;
Przy czym LabelTab jest zadeklarowane tak: LabelTab : array of TLabel;
Co do Buildera to nie mam go zainstalowanego i właściwie w nim nie pisze - więc podam Ci tylko jak by to mogło wyglądać w przybliżeniu - potestuj sobie:
SetLength(LabelTab, ile_labeli); for (int j=0; j<ile_labeli; j++) { Label[j]->Create(Self); Label[j]->Top = 10 + j * 20; [i]{ pozostałe właściwości tego Labela - left, caption itp }[/i] }
| GG:5365367 | ICQ:245363570 |
niestety przy deklaracji tablicy zgłasza błąd :-(
cytat:Slighter napisał:
niestety przy deklaracji tablicy zgłasza błąd :-(
Napisz jak ją deklarujesz - i jaki zgłasza błąd, bo bez tego ciężko domyślić się o co chodzi.
| GG:5365367 | ICQ:245363570 |
znaczy deklaruje ją tak jak napisałeś: LabelTab : array of TLabel;
i zgłasza syntax declaration error
cytat:Slighter napisał:
znaczy deklaruje ją tak jak napisałeś: LabelTab : array of TLabel;
i zgłasza syntax declaration error
To musi zgłaszać błąd - bo to jest deklaracja używana w ObjectPascalu.
Niestety nie wiem jak deklaruje się tablice dynamiczne w C++ - musisz zaczekać aż zajrzy tu ktoś kto pisze w tym języku.
| GG:5365367 | ICQ:245363570 |
no właśnie od początku użykowania C++ Builder zastanawiałem się jak buduje się te tablice zawierające takie komponenty jak Label, a w między czasie nie wiesz przypadkiem dlaczego wyświetla mi błąd (Undefinited Sybmol 'TIniFile')? Przecież ten komponent chyba jest w podstawowej zawartości Buildera (pisze o nim w Helpie i nawet w Ekspercie). Ten fragment w którym chciałem go uzyć wygląda tak:
TIniFile *ini;
ini = new TIniFile( ChangeFileExt( Application->ExeName, ".INI" ) );
powyższy problem już się rozwiązał - trzeba było dołączyć IniFiles.hpp, ale jest już kolejny - nie wiecie skąd ściągnąc komponent TStrings?
cytat:Slighter napisał:
nie wiecie skąd ściągnąc komponent TStrings?
Jesteś pewien, że chodzi Ci o komponent a nie o klasę TStrings ?
| GG:5365367 | ICQ:245363570 |
A jeśli o klasę?
cytat:Slighter napisał:
A jeśli o klasę?
To już ją masz w Builderze - nic nie musisz ściągać.
Możesz sobie deklarować zmienne tego typu.
| GG:5365367 | ICQ:245363570 |
racja program działa...ale w momencie gdy przechodzi do tego fragmentu: RichEdit1->Lines->AddStrings(napis); wyskakuje błąd:
Project chat.exe raised exception class EAccessViolation 'Access violation at address 4002BD57 in module 'rtl60.bpl'. Read of address 00000008'. Process stopped. Use Step or Run to continue.
????????????
cytat:Slighter napisał:
????????????
Pewnie zadeklarowałeś zmienną napis jako TStrings ale jej nie utworzyłeś.
A tak w ogóle to co chcesz osiągnąć ?
Jeśli chcesz dodać do RichEdit'a jakąś linijkę to może to Ci wystarczy:
RichEdit1->Lines->Add(napis);
gdzie napis jest po prostu tekstem jaki chcesz dodać do RichEdit'a.
| GG:5365367 | ICQ:245363570 |
niestety muszę zkorzystać z ini->ReadSection, które potrzebuje TStrings, bo ini->ReadString czyta chyba tylko jedną linijkę np.
1: //to czyta
//a tego już nie
2:
A o co chodzi z tym nie utworzeniem?
cytat:Slighter napisał:
niestety muszę zkorzystać z ini->ReadSection, które potrzebuje TStrings, bo ini->ReadString czyta chyba tylko jedną linijkę np.
Skoro chcesz to załadować do RichEdita to może po prostu:
ini->ReadSection('Jakaś sekcja', RichEdit1->Lines)
| GG:5365367 | ICQ:245363570 |
a zapomniałem że TStrings potrzebne mi jest do funkcji AddStrings() -czyli co mam zrobić
cytat:Oxi napisał:
Pewnie zadeklarowałeś zmienną napis jako TStrings ale jej nie utworzyłeś.
O co ci chodziłio, że jej nie utworzyłem? bo gdy wpisuje: TStrings *napis = new TStrings; to wyświetla mi błędy E2352 i E2353?
cytat:Slighter napisał:
O co ci chodziłio, że jej nie utworzyłem?
Chodziło mi o takie coś:
zmienna := Typ.Create;
[...]
zmienna.Free;
Co do Twojego problemu to jeśli użycie zmiennej typu TStrings jest konieczne to zastosuj typ TStringList (jest to klasa pochodna od TStrings). Bo samo TStrings jest klasą abstrakcyjną i do Twoich celów się nie nadaje.
Poniżej przykładowy kod tworzący TStringList i zwalniający po nim pamięć:
lista := TStringList.Create; try [i][...][/i] finally lista.Free; end;
gdzie lista jest typu TStringList
Kontakt - GG:5365367 / ICQ:245363570
(tylko w sprawach prywatnych - inne pytania proszę zadawać na Forum)
Dzięki Oxi kod jest dobry ale myślę poszłem złą drogą - może spróbuję sformułować o co właściwie mi chodzi: chcę zapisywać gdzieś tekst który mieści się w kilku linijkach - jaki jest najlepszy na to sposób, czy ini to właściwe wyjście?
Naprawdę nie ma żadnego pomysłu? - wybaczcie że się tak narzucam ale to bardzo ważne, a siedzę nad tym od kilku dni i nic. Chodzi po prostu o to, że chcę wprowadzić archiwum w którym przechowywane były by wszystkie notki i żeby po wyłączeniu programu dalej tam były - ini->ReadString czyta tylko pierwszą linijkę z kluczem np. 1=cośtam. Co mam teraz zrobić, gdzie przechowywać ten text?
cytat:Slighter napisał:
Dzięki Oxi kod jest dobry ale myślę poszłem złą drogą - może spróbuję sformułować o co właściwie mi chodzi: chcę zapisywać gdzieś tekst który mieści się w kilku linijkach - jaki jest najlepszy na to sposób, czy ini to właściwe wyjście?
Slighter - opisz dokładnie co chcesz zapisywać - tzn, czy ma to być tylko kilka linijek czy też jakaś ilość kilku linijkowych informacji (np. 15 kilkulinijkowych notatek).
Kontakt - GG:5365367 / ICQ:245363570
(tylko w sprawach prywatnych - inne pytania proszę zadawać na Forum)
ta druga wersja - chce zrobić coś takiego jak archiwum w gg - wychodzisz z okienka rozmowy, a program dodaje ją do archiwum, nie wiem ile będzie tych rozmów na pewno mieścić się będą w kilku linijkach
cytat:Slighter napisał:
ta druga wersja - chce zrobić coś takiego jak archiwum w gg - wychodzisz z okienka rozmowy, a program dodaje ją do archiwum, nie wiem ile będzie tych rozmów na pewno mieścić się będą w kilku linijkach
W typ przypadku proponowałbym do tego zwykły plik tekstowy.
Do dodawania nowych wpisów dobrze nadaje się otworzenie pliku do zapisu poprzez Append - wtedy zostanie ustawiona pozycja na końcu pliku i będzie można dopisywać nowe dane bez utraty starych.
Podczas zapisu możesz dodawać dodatkowo np datę czy godzinę i co tam Ci się jeszcze podoba. Wszystko to będziesz mógł wykorzystać przy odczycie do odpowiedniego sformatowania wyglądu archiwum.
Przy odczycie otwórz plik za pomocą Reset.
Zapis: AssignFile(plik, 'archiwum.dat'); Append(plik); try [i]{ tu zapisujesz co chcesz }[/i] finally CloseFile(plik); end;
Odczyt: AssignFile(plik, 'archiwum.dat'); Reset(plik); try [i]{ tu odczytujesz co chcesz }[/i] finally CloseFile(plik); end;
W obu przypadkach zmienna plik jest typu TextFile.
Do odczytu używasz Readln (lub Read) a do zapisu Writeln (lub Write).
Kontakt - GG:5365367 / ICQ:245363570
(tylko w sprawach prywatnych - inne pytania proszę zadawać na Forum)
niestety wogóle nie znajduje mi tej funkcji AssignFile - prawdopobonie nie ma w C++ Builder, ale przypomniało mi się że jest w C++ podobna metoda do zrobienia tego - trzeba będzie zajrzeć do Symfonii i sobie przybomnieć, jak się uda to poinformuje.
cytat:Slighter napisał:
niestety wogóle nie znajduje mi tej funkcji AssignFile - prawdopobonie nie ma w C++ Builder, ale przypomniało mi się że jest w C++ podobna metoda do zrobienia tego - trzeba będzie zajrzeć do Symfonii i sobie przybomnieć, jak się uda to poinformuje.
No racja - może tego nie być w Builderze, cały czas opierałem się na podobieństwach Delphi i Buildera - ale oczywiście nie wszystko jest tak samo.
Kontakt - GG:5365367 / ICQ:245363570
(tylko w sprawach prywatnych - inne pytania proszę zadawać na Forum)