| Autor | Správa |
TheK.SVK
 Užívateľ
 Založený: 07.08.2009 Príspevky: 18
 | Zaslal: Pi 16.10.09 18:43 |   |
No predpokladam ze v najblizsej dobe budem potrebovat s tymito temami este nejaku pomoc, kazdopadne prave teraz tu mam toto...
| kód: |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
type
TObrazec = class { identifikátory typu* je zvykem
psát s "T" na zac(átku }
private { specifikátor viditelnosti,
viz stránka o zapouzdr(ení }
Fbarva : integer; { identifikátory privátních prome(nných
bývá zvykem psát s "F" na zac(átku }
public { specifikátor viditelnosti,
viz stránka o zapouzdr(ení }
X, Y : integer; { sour(adnice str(edu }
procedure Vykreslit;{ z procedur a funkcí se zda zapíší pouze hlavic(ky }
procedure Smazat;
procedure Presunout(NoveX, NoveY: integer);
procedure Prebarvit(NovaBarva: integer);
end; { konec deklarace tr(ídy TObrazec }
TObdelnik = class(TObrazec) { Tr(ída TObdelnik je zde(de(na z tr(ídy TObrazec }
public
Vyska: integer;
Sirka: integer;
procedure Zvetsit(NovaVyska,NovaSirka:integer);
end; { TObdelnik }
TKruh = class(TObrazec) { Tr(ída TKruh je zde(de(na z tr(ídy TObrazec }
public
Polomer: integer;
procedure Zvetsit(NovaVyska,NovaSirka:integer);
end; { TKruh }
var
form1: Tform;
O : TObdelnik; { Instance objektu* jsou v sekci INTERFACE, }
K : TKruh; { aby tyto objekty byly viditelné zvne(jšku }
implementation
{$R *.dfm}
{ V c(ásti IMPLEMENTATION se dodefinují te(la všech metod všech tr(íd.
Povšimne(te si, že pr(ed názvem metody se musí uvést jméno tr(ídy,
ke které ta metoda patr(í (odde(lené tec(kou). To proto, že stejné
jméno metody mu*že být ve více tr(ídách, jako zde v pr(ípade( Zvetsit. }
procedure TKruh.Zvetsit;
begin
// tady je program pro zve(tšení kruhu
end;
procedure TObrazec.Vykreslit;
begin
// ne(jaký program
end;
procedure TObrazec.Smazat;
begin
// ne(jaký program
end;
procedure TObrazec.Prebarvit(NovaBarva: integer);
begin
// ne(jaký program
end;
procedure TObrazec.Presunout(NoveX, NoveY: integer);
begin
//fdsfsd
end;
procedure TObdelnik.Zvetsit;
begin
//sdasdsa
end;
end. |
Je to kod ktory som nepisal ja, no aj tak netusim preco, nejde ako ma. Ani za toho aby som mohol napriklad v triede obdlzniku dedit nieco z Tobrazec. Vazne nerozumiem preco, pozeral som som viacej navodov, ale asi som uz fakt mimo, vazne neviem v com je problem.
Preco teda nemozem vytvorit napriklad proceduru TObdelnik.Smazat ? Pri takomto pokuse kompilator hlasi neznamy identifikator Smazat...  |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1049
 | Zaslal: Pi 16.10.09 19:19 |   |
| TheK.SVK napísal: | | aby som mohol napriklad v triede obdlzniku dedit nieco z Tobrazec |
Ale trieda TObdlznik je odvodená z triedy TObrazec (takisto aj trieda TKruh), to znamená, že má tie isté premenné a metódy (funkcie, procedúry, vlastnosti) + svoje premenné a metódy. Lenže nerobí sa to cez triedu - TObdelnik.Smazat, ale cez inštanciu triedy:
(TObdelnik.Smazat sa nedá zadefinovať, pretože už je definované ako TObrazec.Smazat)
o je deklarované ako TObdelnik (viz var) a teda dedí aj procedúru Smazat od svojho predchodcu (TObrazec).
Ak sú ešte nejaké nejasnosti alebo ak som to nevysvetlil dosť zreteľne, pýtaj sa. |
| |
   |
 |
TheK.SVK
 Užívateľ
 Založený: 07.08.2009 Príspevky: 18
 | Zaslal: Pi 16.10.09 20:46 |   |
No jasne, chapem, velka vdaka  |
| |
  |
 |
TheK.SVK
 Užívateľ
 Založený: 07.08.2009 Príspevky: 18
 | Zaslal: Ut 27.10.09 21:45 |   |
Urobil som taky zjednoduseny model situacie do ktorej som sa dostal... velmi jednoducha, akurat ze neviem ako ju riesit a aky je dovod vysledku....
| kód: | unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
constructor Create;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
x,y:integer;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
constructor TForm1.Create;
begin
x:=5;
y:=100;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1:=TForm1.Create;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
label1.Caption:=IntToStr(x);
label2.Caption:=IntToStr(y);
end;
end. |
Moja nejasnost: Po kliknuti na Button1 sa zobrazi vysledok 0 a 0 miesto 5 a 100. Preco ? |
_________________ MB: Gigabyte GA MA790X, CPU: AMD Phenom II X3 720@ 3.5Ghz, VGA: Gibayte GTX275UD-896I, PSU: CoolerMaster M620, HDD:WesternDigital 6400AAKS, CPU chladic:CoolerMaster Hyper 212, CASE: CoolerMaster Elite 330, 2xAiren RedWings ThermoControl | |
  |
 |
programator
 Užívateľ
 Založený: 02.09.2005 Príspevky: 156
 | Zaslal: St 28.10.09 16:15 |   |
Konstruktor "constructor TForm1.Create;" ti je zbytocny... vymaz ho a priradenia napis do procedury "procedure TForm1.FormCreate(Sender: TObject);". Nie je potrebne vytvarat konstruktor, pretoze form ho ma a delphi si ho automaticky obsluhuje. |
_________________ Múdry nie je ten, čo veľa vie, ale ten, kto vie, čo je treba. (Thomas Alva Edison) | |
   |
 |
TheK.SVK
 Užívateľ
 Založený: 07.08.2009 Príspevky: 18
 | Zaslal: St 28.10.09 23:57 |   |
| programator napísal: | | Konstruktor "constructor TForm1.Create;" ti je zbytocny... vymaz ho a priradenia napis do procedury "procedure TForm1.FormCreate(Sender: TObject);". Nie je potrebne vytvarat konstruktor, pretoze form ho ma a delphi si ho automaticky obsluhuje. |
Ja viem, nejde o to ze by som to nevedel urobit tak ako si napisal, ale nevedel som preco to neslo tak ako som to napisal... riesenie bolo ze som musel urcit aj triedu x a y bud pri priradeni hodnoty v konstruktore, alebo pri ich ukladani do labelu...
Form1.x:=5;
Form1.y:=100; ... alebo
label1.Caption:=IntToStr(form1.x);
label2.Caption:=IntToStr(form1.y);
.... Otazkou mi vsak zostava preco je to tak ? Vie mi to niekto vysvetlit ? |
_________________ MB: Gigabyte GA MA790X, CPU: AMD Phenom II X3 720@ 3.5Ghz, VGA: Gibayte GTX275UD-896I, PSU: CoolerMaster M620, HDD:WesternDigital 6400AAKS, CPU chladic:CoolerMaster Hyper 212, CASE: CoolerMaster Elite 330, 2xAiren RedWings ThermoControl | |
  |
 |
TheK.SVK
 Užívateľ
 Založený: 07.08.2009 Príspevky: 18
 | Zaslal: So 07.11.09 16:36 |   |
Mam novu otazku.... Ake su obmedzenia pre vlastnosti visible a enabled ? V niektorych castiach kodu mi proste vobec nereaguju
Napriklad:
| kód: | begin
vyhodnotenie:=TVyhodnotenie.create (Application);
Vyhodnotenie.Show;
Hra.Visible:=false;
end; |
Pri po vytvoreni noveho formulara sa ma byt formular Hra neviditelny, avsak nic take sa nestane, stale ho vidim, napriek tomu ze po overeni podmienkou
if hra.Visible=false then label1.Caption:='invisible' zistujem, ze tu neviditelnost skutocne nastavenu ma. Ale aj tak ho vidim. Podobne nefunguje v tomto pripade ani vlastnost enabled.
*confused*
Procedure Hide taktiez "nefunguje".... |
_________________ MB: Gigabyte GA MA790X, CPU: AMD Phenom II X3 720@ 3.5Ghz, VGA: Gibayte GTX275UD-896I, PSU: CoolerMaster M620, HDD:WesternDigital 6400AAKS, CPU chladic:CoolerMaster Hyper 212, CASE: CoolerMaster Elite 330, 2xAiren RedWings ThermoControl | |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1049
 | Zaslal: Ne 08.11.09 11:54 |   |
Pošli viac kódu (najlepšie unit, v ktorom je hlavný formulár a projekt), inak sa môžme len domnievať, čo je čo a ako vlastne myslíš svoju otázku. Obmedzenia pre visible? Žiadne obmedzenia nie sú. Musíš si proste uvedomiť, že ak použiješ Visible:= false na formulár, ktorý ešte nie je vykreslený, tak sa to neaplikuje. |
| |
   |
 |
TheK.SVK
 Užívateľ
 Založený: 07.08.2009 Príspevky: 18
 | Zaslal: Ne 08.11.09 14:52 |   |
No tak vcera som este skusal par veci, a zistil som...
1)Ako si spomenul,ze visible mozem menit az po vykresleni
2)Ze ak je hlavny formular uz vykresleny, a chcem mu menit viditelnost napriklad pri kliknuti na tlacidlo, mozem tak urobit jedine pomocou
| kód: | procedure THlavnyFormular.Button1Click(Sender: TObject);
begin
Application.Mainform.Visible:=false
end; |
, zatial co na vedlajsom formulari tak mozem urobit priamo ako
| kód: | procedure TFormular2.Button1Click(Sender: TObject);
begin
Formular2.Visible:=false
end; |
3)Rovnako to funguje aj s vlastnostou enabled...
Je to proste take pravidlo alebo sa k tomu da dodat nieco na vysvetlenie ? |
_________________ MB: Gigabyte GA MA790X, CPU: AMD Phenom II X3 720@ 3.5Ghz, VGA: Gibayte GTX275UD-896I, PSU: CoolerMaster M620, HDD:WesternDigital 6400AAKS, CPU chladic:CoolerMaster Hyper 212, CASE: CoolerMaster Elite 330, 2xAiren RedWings ThermoControl | |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1049
 | Zaslal: Ne 08.11.09 17:29 |   |
A si si istý, že ti toto nefunguje?
| kód: | procedure THlavnyFormular.Button1Click(Sender: TObject);
begin
Visible:=false
end; | Lebo mne to riadne skryje formulár (aj keď ich je viac, skryje ten správny). |
| |
   |
 |
TheK.SVK
 Užívateľ
 Založený: 07.08.2009 Príspevky: 18
 | Zaslal: Po 09.11.09 19:38 |   |
Fuh, no veru nie, ale ako vravis, v novovytvorejenj cistej aplikacii to funguje bez problemov. Ked zadam kontrolnu podmienku ktora mi zisti ci je alebo nie je formular viditelny, pise ze viditelny nie je. Pri tom ho tam vsak stale mam.
Pri tom to nefunguje hned po tom, ako sa vykonaju urcite operacie v konstruktore kde sa len priraduju obrazky do pola obrazkov. S viditelnostou nikde nic nemenim.
No nic, asi to uz nejdem riesit, vyzera to ze mainform.visible funguje naozaj "univerzalne", hlavne ze ide... |
_________________ MB: Gigabyte GA MA790X, CPU: AMD Phenom II X3 720@ 3.5Ghz, VGA: Gibayte GTX275UD-896I, PSU: CoolerMaster M620, HDD:WesternDigital 6400AAKS, CPU chladic:CoolerMaster Hyper 212, CASE: CoolerMaster Elite 330, 2xAiren RedWings ThermoControl | |
  |
 |
TheK.SVK
 Užívateľ
 Založený: 07.08.2009 Príspevky: 18
 | Zaslal: So 21.11.09 21:03 |   |
Dnes som narazil na taky problem...
Mam nejake obrazky na formulari, pri kliknuti na ne sa premiestnuju. Avsak nesmu sa premiestnovat dva naraz. Potrebujem aby sa premiestnil jeden, a az potom sa dal premiestnit iny. Pohyb prebieha cez vlakna.
1)Mam proceduru CheckMove ktora prebehne len ak neprebieha nejake vlakno. To zistuje pomocou boolean premennej DONE.
2)CheckMove nadvazuje na MoveImage ktora zistuje kam ho treba posunut a aktivuje potrebne vlakno (hore, dole, vlavo, vpravo). Pred zavolanim vlakna urci ze DONE:=false;
3)Vlakno posuva obrazok a nakoniec nastavi DONE:=true;
Problem je v tom, ze procedura CheckMove prebehne cela aj napriek tomu, ze je spustene uz nejake vlakno. Absolutne nerozumiem ako je to mozne, kontroloval som to a po cely cas behu toho vlakna done=false;
Osekany kod pre prehladnost, ziadne veci ktore by mali suvis s premennou done som nezmazal.
| kód: | procedure Thra.CheckMove;
begin
if DONE then
begin
......................................................
kod ktory dalej pokracuje do THra.MoveImage;
......................................................
end;
end;
Procedure Thra.MoveImage;
var zhora,zlava:integer;
begin
DONE:=false;
...................................................................................................................
kod s podmienkami kde sa rozhodne ktore vlakno sa spusti - hore, dole,vlavo alebo vpravo
...................................................................................................................
While DONE=false do Application.ProcessMessages;
end;
procedure TPosunToRightThread.Execute;
begin
FreeOnTerminate := True;
................................................
cyklus ktory posuva obrazok o 1px
.................................................
DONE := True;
end; |
|
_________________ MB: Gigabyte GA MA790X, CPU: AMD Phenom II X3 720@ 3.5Ghz, VGA: Gibayte GTX275UD-896I, PSU: CoolerMaster M620, HDD:WesternDigital 6400AAKS, CPU chladic:CoolerMaster Hyper 212, CASE: CoolerMaster Elite 330, 2xAiren RedWings ThermoControl | |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1049
 | Zaslal: So 21.11.09 21:44 |   |
| TheK.SVK napísal: | | Problem je v tom, ze procedura CheckMove prebehne cela aj napriek tomu, ze je spustene uz nejake vlakno. |
Ak som to pochopil správne, tak ak je tá procedúra v nejakom takom tvare:
| kód: | procedure Thra.CheckMove;
begin
if DONE then
begin
// nejaky kod
// proceduera THra.MoveImage
// * nejaky dalsi kod, ktory sa uz nema vykonat, ak je DONE false
end;
end; |
tak kód od hviezdičky sa už nemá vykonať v prípade (DONE = false) ? |
| |
   |
 |
TheK.SVK
 Užívateľ
 Založený: 07.08.2009 Príspevky: 18
 | Zaslal: So 21.11.09 21:51 |   |
No CheckMove konci uz len zavolanim MoveImage.... aby nedoslo k nedorozumeniu, pridavam cely kod problemovej casti...
//edit: ono mozem to urobit tak ze na zaciatku MoveImage dam Application.Mainform.Enabled:=false, a na koniec metody MoveImage znova true, ale to sposobuje ten neprijemny zvuk a myslim si ze je to lamsky sposob riesenia...
| kód: | procedure Thra.CheckMove;
begin
if done then
begin
if ((Obrazky[Xinvis,Yinvis].top * Obrazky [Xclicked,Yclicked].Top<>4400))
and (Obrazky[XInvis,Yinvis].Left=obrazky[XClicked,Yclicked].Left) then MoveImage;
if ((Obrazky[Xinvis,Yinvis].left * Obrazky [Xclicked,Yclicked].left<>816))
and (Obrazky[XInvis,Yinvis].Top=obrazky[XClicked,Yclicked].Top) then MoveImage;
end;
end;
Procedure Thra.MoveImage;
var zhora,zlava:integer;
begin
if FirstClick=true then
begin
StartTime:= Now();
FirstClick:=false;
End;
Zhora:=obrazky [xclicked,yclicked].Top;
Zlava:=Obrazky [xclicked,yclicked].Left;
Done:=false;
if not done then label1.Caption:='disabled';
if obrazky [Xclicked,Yclicked].Top=obrazky [Xinvis,Yinvis].Top then begin
if obrazky [Xclicked,Yclicked].Left>obrazky [Xinvis,Yinvis].Left then begin
ToLeftThread := TposunToLeftThread.Create(false);
end;
end;
if obrazky [Xclicked,Yclicked].Top=obrazky [Xinvis,Yinvis].Top then begin
if obrazky [Xclicked,Yclicked].Left<obrazky [Xinvis,Yinvis].Left then begin
ToRightThread:= TposunToRightThread.Create(false);
end;
end;
if obrazky [Xclicked,Yclicked].Left=obrazky [Xinvis,Yinvis].Left then begin
if obrazky [Xclicked,Yclicked].Top>obrazky [Xinvis,Yinvis].Top then begin
ToDownThread:= TposunToDownThread.Create(false)
end;
end;
if obrazky [Xclicked,Yclicked].Left=obrazky [Xinvis,Yinvis].Left then begin
if obrazky [Xclicked,Yclicked].Top<obrazky [Xinvis,Yinvis].Top then begin
ToUpThread := TposunToUpThread.Create(false);
end;
end;
While Done=false do Application.ProcessMessages;
if done then label1.Caption:='enabled';
obrazky [Xinvis, Yinvis].Top:=Zhora;
Obrazky [Xinvis, Yinvis].left:=Zlava;
CheckWin;
end;
////////////////////////////////////////////////////////////////////////////////////////
// POSUNY - VLAKNA //
////////////////////////////////////////////////////////////////////////////////////////
procedure TPosunToRightThread.Execute;
var StartAnimationPosition:integer;
begin
FreeOnTerminate := True;
StartAnimationPosition:=Obrazky [Xclicked,Yclicked].Left;
for StartAnimationPosition:=StartAnimationPosition To obrazky[Xinvis,Yinvis].left do begin
if (StartAnimationPosition mod 4)=0 then Obrazky [Xclicked,Yclicked].Left:=StartAnimationPosition;
synchronize (hra.vykresli);
end;
Done := True;
end;
procedure Thra.vykresli;
begin
sleep (1);
end; |
|
_________________ MB: Gigabyte GA MA790X, CPU: AMD Phenom II X3 720@ 3.5Ghz, VGA: Gibayte GTX275UD-896I, PSU: CoolerMaster M620, HDD:WesternDigital 6400AAKS, CPU chladic:CoolerMaster Hyper 212, CASE: CoolerMaster Elite 330, 2xAiren RedWings ThermoControl | |
  |
 |
|
Nemôžete pridávať nové témy do tohto fóra. Nemôžete odpovedať na témy v tomto fóre. Nemôžete upravovať svoje príspevky v tomto fóre. Nemôžete mazať svoje príspevky v tomto fóre. Nemôžete hlasovať v tomto fóre.
|
|