Těžko poradit ... zkus es nejdříve kouknout sem http://programujte.com/?akce=diskuze&kam=vlakno&tema=16215-sitove-pripojeni ... a když ani potom se ti nepodaří vyloudit kloudnou funkci, tak sem šoupni kompletní projekt :)
Příspěvky odeslané z IP adresy 85.207.166.–
Jednak ... řetězec je taky pole bajtů (nebo dvojbajtů) ... druhak ... pole bajtů k odeslání lze vytvořit i z číselných souřadnic např. takto:
// souradnice
UInt32 x = 10;
UInt32 y = 15;
// data k odeslani
byte [] data = new byte[8];
Buffer.BlockCopy(BitConverter.GetBytes(x), 0, data, 0, 4);
Buffer.BlockCopy(BitConverter.GetBytes(y), 0, data, 4, 4);
A spojení si samozřejmě nemusíš vytvářet pokaždé. Dokonce to jde i proti principu TCP spojení, kde by si měl držet spojení až do chvíli, kdy upadne nebo ho už nepotřebuješ. Takže v nějaké inicializaci se jednou připoj, proměnné udělej jako členské a máš to.
Co se týká primitivní grafiky, tak ta je v C++ rychlá. Kreslení čar, obdélníků, ale i textů ... všude se budeš pohybovat na hranici měřitelnosti časové náročnosti. Pokud ovšem budeš chtít v tom svém programu zoomovat, nebo-li by si se jal Stretchovat, tak to by si se mohl do problémů. Všechno záleží (jako vždy) na to, co má být cílem, jaký je rozsah. A jak jsem psal výše, nad dobrou datovou reprezentací se grafika dělá velice snadno (ať si vybereš jakýkoliv způsob).
No ... řekněme, že tě chápu :) a kdybych napsal příspěvek ve tvém stylu, tak bude obsahovat: mě to funguje.
Naštěstí je každý člověk unikát, tak i příspěvky se budou lišit :) Tady je příklad (funkční) funkce :) pro nastavení textu TextBoxu, který je předán jako parametr:
private void SetTextBoxText(Control textBox)
{
textBox.Text = "Nejaky text";
}
// a nekde v kodu volam, kde textBox1 instance TextBoxu na formulari
SetTextBoxText(textBox1);
Budeš mít ArrayList jehož prvky budou zase ArrayListy a jeho prvky budou třeba inty, stringy ... podle toho, co potřebuješ. Malá ukázka:
ArrayList list = new ArrayList();
for (int i = 0; i < 10; i++)
{
ArrayList item = new ArrayList();
for (int j = 0; j < 10; j++)
{
item.Add(i * 10 + j);
}
list.Add(item);
}
foreach (ArrayList item in list)
{
foreach (int i in item)
{
Console.Write(i + ", ");
}
}
Pokud chceš vytvořit aplikaci, kde budeš pohybovat grafickými objekty, tak základ je vhodná datová reprezentace (nejlépe objektová). Následné vykreslení je již třešničkou na dortu a můžeš ho udělat klidně i znaky na konzoly :). Jinak na tu tvojí grafiku je DirectX a OpenGL trochu kanón na vrabce, na to ti stačí i primitivní GDI grafika.
Vždycky ne ... když máš číslo 1.23456 a chceš ho zaokrouhlit na 3 místa nahoru (pokud ho tedy chceš zaokrouhlit nahoru :)), tak přičteš 0.0005 a dostaneš 1.23506, ořízneš přebytečná desetinná místa a máš to.
Když by si měl číslo 1.2344999999 a menší (do 1.2340), tak přičtením 0.0005 dostaneš 1.2349999999 a když ořízneš přebytečná desetinná místa, tak dostaneš 1.234, nebo-li to co si chtěl (ten dlouhý zástup 9 na konci ber s rezervou viz přesnost desetinných čísel).
A co je vůbec ten dir_pack_files? Předáváš do té funkce jeho property Text, ale uvnitř té funkce měníš obsah lokálního řetězce. Lepší bude předat dir_pack_files apod. a místo slozka1 = vypis_a; dát neco.Text = vypis_a; Třeba to bude fungovat :)
Nejspíš někde něco existovat bude (možná v Math nebo přes DecimalFormat), ale zaokrouhlení lze udělat jednoduše i "ručně". V tvém případě je to nějak takto:
double dValue = 12.456789;
// oriznuti desetinne casti
int nTemp = (int)((dValue + 0.0005) * 1000.0);
// zpetny prevod na double
double dFinal = ((double)nTemp)/1000.0;
Ty máš volání funkce někde na úrovni definování funkcí a proměnných té třídy? Zavolej to třeba z mainu, nějak takto:
static void Main(string[] args)
{
VypisXML(1, dir_pack_files.Text, slozka_dir.Text);
VypisXML(2, dir_unpack_files.Text, slozka_unpack,Dir.Text);
}
Ten odkaz, co si dal, to ale vypadá na vlastní kompletní implementaci, tj. žádná jednoduchá náhrada ikony za ikonu, ale celá nová komponenta resp. sada komponent. Obávám se, že tak jednoduše, jak si to představuješ, to nepůjde, ale hledej dál, třeba se pletu :)
EDIT: tak se asi pletu :), buď přes OwnerDraw ToolTipu http://msdn.microsoft.com/en-us/library/system.windows.forms.tooltip.ownerdraw.aspx nebo můžeš použít klasické WInAPI, kde lze zprávou TTM_SETTITLE poslat i HICON (http://msdn.microsoft.com/en-us/library/bb760414(VS.85).aspx).
Když máš komunikaci v rámci jednoho počítače, tak taky používáš IP adresu. Buď přímo (127.0.0.1) nebo pojmenovanou (localhost). Stačí tedy místo lokální IP adresy zadat IP adresu vzdáleného počítače. Jestli trváš na příkladu,t ak dej vědět a něco dáme dohromady ;)
Když vytvoříš knihovnu, kterou použiješ v aplikaci, tak potřebuješ hlavičkový soubor (.h), aby aplikace věděla, jaké má funkce parametry, návratovou hodnotu atd. Pro překlad potřebuješ ještě soubor .lib, který vznikne při tvorbě knihovny dll. V také .lib je napsáno, kde a jak se ta funkce najde - je tam prostě napsáno, ve které dll a na které adrese ji najde. No a pro souštění potřebuješ tu knihovnu.
Na konci té stránky, co se postnul zdenda, je napsáno, že pro Rectangle potřebuješ takový a takový hlavičkový soubor a takovou a takovou libku. BeginPaint (http://msdn.microsoft.com/en-us/library/dd183362(VS.85).aspx) je v jiné knihovně, a proto ti to funguje. Stačí prostě přidat někam do nastavení projektu (podle toho v čem to děláš) Gdi32.lib.
A s tím heslem ... jestli myslíš tady na fóru, tak po přehlášení stačí kliknout na tvůj nick vpravo nahoře a přejdeš na Nastavení účtu, kde by se mělo dát heslo změnit. Když to nepůjde, tak se obrať na vrchního velitele (Curo).
Mě ty 2 "struktury" přijdou velice podobné. Škoda, že nepíšeš proč ti nešli kódy z tutoriálu - chybovou hlášku nebo něco. Vstupní bod spuštění aplikace je statická funkce main. To je asi jediný rozdíl, že v jednom kódu je v extra třídě a v druhém kódu je součástí třídy, ale jinak .... hoď sem ten příklad, co ti nešel i s chybovou hláškou a uvidíme :)
Hmmmm ... lákavá nabídka :smile1: . Řekl bych, že to stačí dávat sem na fórum a on se vždycky najde nějakej dobrák, co ti na tom nenechá nit suchou. Alespoň budeš mít veřejnou kontrolu, že tě netahá za nos :smile1:. Pokud sis to představoval jinak, tak můžeš nastínit svoji představu a uvidíme ...
To ani nemůže jít, protože proměnná MainFrame není v ControlPanel definována. Přímo by to šlo pouze v případě, že by si přistupoval ke statickým metodách a/nebo proměnným. Jinak potřebuješ předat referenci na instanci.
Takže v MainFrame
controlPanel1 = new MainPackage.ControlPanel(this);
a v ControlPanel
// clenska promemenna pro dalsi vyuziti
MainFrame frame;
public ControlPanel(MainFrame frame) {
initComponents();
this.setSize(300, 300);
this.frame = frame; // kdyby si to chtel jeste nekdy v ControlPanel pouzit
frame.jLabel1.setText("test");
}
Přepočítáš si souřadnice přes funkce PointToClient a PointToScreen (nebo Win32 funkce ClientToScreen, ScreenToClient).
Pokud vím, tak pohyb myši resp. kurzoru zakázat nemůžeš, ale můžeš ho odchytit (a ignorovat) nebo vymezit oblast pohybu System.Windows.Forms.Cursor.Clip (ve Win32 ClipCursor).
Překlad musíš udělat v Release konfiguraci. A pokud ani potom nepůjde aplikaci spustit, tak se můžeš podívat např. přes http://www.dependencywalker.com/, jaké má aplikace závislosti a jaké knihovny potřebuje.
No vidíš ... tomu se říká ladění. Pokud nemůžeš použít krokování, tak můžeš použít MessageBoxy nebo nějaké OutputDebugStringy .... prostě cokoliv, čím zjistíš, do jaké části programu ses dostal a proč. Prošpikuj to breakpointy nebo výpisy a třeba na to za chvilku přijdeš sám.
To bude asi toto (http://forums.digitalpoint.com/showthread.php?t=459892#post4329462), ne? Jinak první odkaz z googlu :)
Je to XML, takže čtení je jasný i jeho zpracování. Jediný, co potřebuješ, je specifikace http://docs.oasis-open.org/office/v1.0/OpenDocument-v1.0-os.pdf.
Jenom si na GridBagLayout dej pozor. S těmi jednoduššími uděláš v podstatě stejnou práci a nebudeš z toho mít tak zamotanou hlavu (http://programujte.com/?akce=diskuze&kam=vlakno&tema=14789-layout-managery), ale pokud ho opravdu nutně potřebuješ ...
Klasický DOC není zip, ale binární soubor. Pokud myslíš OpenDocument, OOXML a tyhle vymoženosti moderní doby :), tak to jsou zipy, které když rozbalíš, tak zjistíš, že základem je XML. No a když jejich názvy zadáš do googlu, tak rozhodně něco najdeš. Stejně je DocBook lepší ;)
Nejdřív si rozmysli, co vlastně chceš. Jestli chceš gadget http://msdn.microsoft.com/en-us/library/aa965850.aspx nebo jestli chceš "normální" aplikaci s ikonkou v trayi.
Pokud se týká minimalizace do systémové oblasti u hodin, tak to je vlastně takový trik. Odchytíš WM_SYSCOMMAND resp. SC_MINIMIZE a aplikaci skryješ (SW_HIDE). No a vytvoříš si ikonu v trayi (Shell_NotifyIcon s parametrem NIM_ADD), kterou při obnovení aplikace (SW_RESTORE) zase zrušíš (Shell_NotifyIcon s parametrem NIM_DELETE).
To Maro : Řekl bych, že máš stále problém s pochopením principu. Ty nemusíš být "fyzicky" v tom adresáři, aby si mohl vypsat jeho obsah, nebo-li nebudeš měnit current directory. Nevím, jestli děláš ve woknech nebo tuňákovi, ale řekněme, že ve woknech :). Řekněme, že by si chtěl něco takového udělat s pomocí příkazu dir. Příkaz dir dokáže vypsat obsah adresáře a "finta" je v tom, že bez parametrů vypisuje obsah aktuálního adresáře, ale s parametrem vypisuje obsah zadaného adresáře.
Měl by si skript, který by si prvně zavolal bez parametrů (např. výpis disku C:). On by ti vypsal soubory a také adresáře. Byl by tam třeba i adresář MojeFotky. Takový adresář by byl "klikací odkaz", který by tomu tvému skriptu předával právě ten parametr, který by mu oznamoval, kde se má provést další výpis. A kupodivu by ten parametr název toho adresáře resp. úplná cesta k němu.
Takže vypisuješ obsah C:, našel si adresář MojeFotky, takže do do parametru toho odkazu dáš "součet" cesty aktuálně vypisovaného adresáře a jména nalezeného adresář, nebo-li C:\MojeFotky. Takový parametr by se po kliknutí na ten odkaz předal tomu skriptu a byl by to tvůj aktuálně vypisovaný adresář, takže v programu by si udělal dir $jméno_adresáře. Samozřejmě by to našlo zase adresáře, třeba adresář 2010. Takže by si udělal to samé - sečetl by si řetězce -> $jméno_adresáře + 2010 = C:\MojeFotky\2010 - to by byl parametr toho nově nalezeného adresáře.
Nemění se "fyzický" aktuální adresář - getcwd mi bude vracet pořád to samé. Mění se pouze aktuálně vypisovaný adresář, který si stále předávám jako parametr. To, co dostaneš na vstupu toho skriptu jako adresář, kde se má provést výpis, použiješ dále na tvorbu cesty parametrů další podadresářů.
Předáváš skriptu parametry a je jedno jak. Na začátku mu nepředáváš nic -> kořenový adresář. Uděláš jeho výpis a jména adresářů budou odkazy, které budou mít nastavený ten předávaný parametr. Nebo může předávat těch parametrů víc (aktuální adresář + nový adresář) apod. Těch možností je určitě víc. Rozhodující je, aby si při procházení stále přidával a nezapomínal na to, že potřebuješ "úplnou cestu".
Stejně jako se to řeší jinde, tj. budeš mít v tvém případě skript, který bude vypisovat adresáře a soubory v aktuálním adresáři. Po kliknutí na nějaký z těch vypsaných adresářů se tomu skriptu předá nový aktuální adresář, který bude složen z původního + jméno kliknutého adresáře :)
Jen tak mimochodem, četl jsem tebou vyvolanou diskuzi u konkurence :) (včera) a měl bych k tomu poznámku: 8 královen je na oko jednoduchá úloha, ale setkal jsem se s ní až na vysoké, kde to byla jedna ze semestrálních prací v nějakém předmětu o programování a také to byla úloha v matematické logice (prohledávání stavového prostoru). Řešení pomocí backtrackingu je o něco jednodušší než pomocí "simulace šachovnice", ale stejně se u ní zapotíš, což už si asi zjistil.
Místo mouse_event používej SendInput (http://msdn.microsoft.com/en-us/library/ms646310(v=VS.85).aspx):
[DllImport("User32.dll")]
public static extern uint SendInput(uint numberOfInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] input, int structSize);
[StructLayout(LayoutKind.Explicit)]
public struct INPUT
{
[FieldOffset(0)]
public int type;
[FieldOffset(4)] //*
public MOUSEINPUT mi;
[FieldOffset(4)] //*
public KEYBDINPUT ki;
[FieldOffset(4)] //*
public HARDWAREINPUT hi;
}
[StructLayout(LayoutKind.Sequential)]
public struct MOUSEINPUT
{
public int dx;
public int dy;
public uint mouseData;
public uint dwFlags;
public uint time;
public IntPtr dwExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
public struct KEYBDINPUT
{
public ushort wVk;
public ushort wScan;
public uint dwFlags;
public uint time;
public IntPtr dwExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
public struct HARDWAREINPUT
{
uint uMsg;
ushort wParamL;
ushort wParamH;
}
No a pak máme 2 tlačítka, když na jedno z nich klikneme a bude tam takováto kód:
private void button1_Click(object sender, EventArgs e)
{
INPUT[] mouse = new INPUT[3];
mouse[0].type = 0/*INPUT_MOUSE*/;
mouse[0].mi.dx = -100;
mouse[0].mi.dy = -100;
mouse[0].mi.dwFlags = 0x0001/*MOUSEEVENTF_MOVE */;
mouse[0].mi.time = 0;
mouse[0].mi.dwExtraInfo = (System.IntPtr)0;
mouse[1].type = 0/*INPUT_MOUSE*/;
mouse[1].mi.dx = 0;
mouse[1].mi.dy = 0;
mouse[1].mi.dwFlags = 0x0002/*MOUSEEVENTF_LEFTDOWN */;
mouse[1].mi.time = 0;
mouse[1].mi.dwExtraInfo = (System.IntPtr)0;
mouse[2].type = 0; /*INPUT_MOUSE*/
mouse[2].mi.dx = 0;
mouse[2].mi.dy = 0;
mouse[2].mi.dwFlags = 0x0004; /*MOUSEEVENTF_LEFTUP*/;
mouse[2].mi.time = 0;
mouse[2].mi.dwExtraInfo = (System.IntPtr)0;
uint ret = SendInput((uint)mouse.Length, mouse, Marshal.SizeOf(mouse[0].GetType()));
}
tak se pohne myš relativně o -100, -100 a "klikne" na tomto novém místě, takže pokud je na tom místě jiné tlačítko, tak se ti to dostaneme zase do OnClick toho tlačítka.
Takhle nějak:
public class Trida {
private StringBuffer poradi;
public Trida(){
poradi = new StringBuffer();
}
public void actionPerformed(ActionEvent event) {
if (event.getSource() == jednicka ) {
int cislo = 1;
poradi.append(cislo);
pole.setText(poradi.toString());
}
if (event.getSource() == dvojka ) {
int cislo = 2;
poradi.append(cislo);
pole.setText(poradi.toString());
}
Máš to ve woknech a tam to jde určitě, takže můžeš zkusit jít cestou http://ai2t.de/weinert/java/docs/frame4j/de/a_weinert/io/WinDoesIt.html nebo podobné http://www.cs.berkeley.edu/~jfc/fbarr/Research/External%20Software/SerialIO/ProWin/JNI/jspWin.c.
Jsou to jedny z prvních odkazů, co našel google a moc jsem to neprohlížel :)
To bude stejná chyba jako zde http://programujte.com/?akce=diskuze&kam=vlakno&tema=16398-cteni-ze-souboru, prostě ten StringBuffer poradi musí být "globální" (instanční proměnná).
Toho je na netu mraky ... první odkaz z googlu http://download.oracle.com/javase/tutorial/uiswing/components/frame.html. Ovšem ještě lepší by bylo, kdyby si sem šoupnul to, co si vytvořil, protože jinak je možný, že oba myslím úplně něco jiného :)
Tak to si musíš osvojit základy (algoritmizace) a je jedno v jakém programovacím jazyce (pro začátek ti bude stačit Pascal nebo můžeš zkusit Python). A kalkulačka je docela dobrá meta, až jí dosáhneš, tak budeš k manageru o dost blíž než si teď, ale bude ti to připadat o dost dál než teď ;)
Pro začátek sis vybral docela velké sousto. Jestli nemáš s programováním velké zkušenosti (nenapsal si, co umíš !), tak to pro tebe poměrně dlouho trvající projekt. Nejlepší bude, když napíšeš, co umíš. No a pokud nic, tak viz Gatuso :) resp. začni něčím o několik řádu jednodušším.
Ještě otázka ... v jaké konfiguraci si to měřil (Debug - _DEBUG/Release - NDEBUG)? Nesmíš zapomenou, že stack (a další) jsou objekty ... což samo o sobě může vést k nějakému zdržení, ale v ladícím režimu (Debug) je to ještě navíc prošpikováno různými kontrolami atd., takže tu o zdržení není nouze (na jednom volání to nikdo nepozná, na milionu volání už to poznat je).
Samozřejmě k tomu kódu mám výhrady, ale pokud je funkční, tak budiž :) No a pokud si to měřil v Release konfiguraci a chceš dosáhnout větší rychlosti,t ak si asi budeš muset napsat svůj jednoúčelový a tudíž optimálnější stack.
Na okraj poznámka: filipika proti goto je takový kolorit, ale před časem jsem musel uznat, že jeho úplné zatracování je stejně nesmyslné jako každá jiná "slepá víra". V tomto tvém případě použití se ukazuje, jak může být program s použití goto značně nepřehledný. Ovšem při jeho vhodném použití lze ušetřit poměrně dost.
A teď k tomu tvému programu. Proč sem nedáš oba ty algoritmy? I to jak plníš ten strom atd. prostě kompletně celé. A nejlépe tak, jak si to měřil (zápis do souboru). Pokud chceš říct, proč je to v tvém konkrétním případě tak a tak, tak se musíš dát konkrétní kód.
Nějak ty stránky musíš zobrazit. Pokud ti stačí zdrojový kód, tak editační pole, ale ty asi chceš tu stránku vidět tak, jak jí Curo stvořil, že? :smile1: Sám si to asi psát nechceš, takže se podívej na IWebBrowser2, případně zabrus do nějaké nadstavby (.NET, MFC), kde existují cosi jako HTML view.
Tak to vypadá, že to tam prostě nikde není :)
A prej buď editovat registr ručně nebo můžeš zkusit toto: http://www.technize.com/advanced-file-types-association-in-windows-7/, jestli to dělá to, co píšou ;)
Rozhodně jde pole komponent:
TPanel* panely[10];
for (int i = 0;i < 10;i++) {
panely[i] = new TPanel(Form1);
panely[i] ->Parent = Form1;
panely[i] ->Top = 0;
panely[i] ->Left = pPredchozi->Right;
panely[i] ->Width = pPredchozi->Width;
panely[i] ->Height = pPredchozi->Height;
pPredchozi = panely[i];
}
Když píšeš "... musí se prvky vypisovat a odebírat ..." (odebírat by nemusely), tak jestli děláš v tom nerekurzivním něco navíc proti rekurzivnímu (zejména nějaký ten výpis navíc), tak tomu rozdílu nemůžeš divit.
Jinak takto obecně položená otázka ... tak odpovědí budou takové ty obecně platné pravdy. Vždycky jde napsat jedna verze super optimálně a druhá super neoptimálně - řekl bych, že hodnotit se dá pouze konkrétní implementace.
Budeš k tomu potřebovat jeden for cyklus. V něm budeš tvořit nové instance TPanel a kopírovat jejich parametry (pokud nemáš k dispozici kopírovací konstruktor), tj. např. stejné rozměry. No a pozici budeš "počítat" z toho vedle stojícího.
O peníze jde až v první řadě ;)
A ano, je tam podnikatelské riziko. Ta programátorská lemra si udělá chybu, kterou pak 3 dny hledá a přitom jde o moje penízky. Což je myslím naprosto přesná definice zaměstnaneckého poměru :)
To, co tomu programátorovi chybí, je motivace. Když má fixní plat, tak co ho nutí udělat zakázku dřív? Co z toho bude mít mimo dobrého pocitu? Dostane pochvalu? Dostane přidáno? Někdy stačí to někdy ono. Někdy stačí rozdělit plat na fixní část a na část závislou na "úspěchu firmy", jenom pozor na to, aby to nakonec nebyly dvě fixní položky :). Na tohle jsou (vysmívané) manažerské kurzy, kterak motivovat lidi. A vo vo tom to je ... :)
Nemám agentůru natož reklamní a v podstatě jsem na druhé straně barikády. Ale dle mých zkušeností se takovýto problém neřeší způsobem: kolik hodin na to potřebuješ * mzda = výsledná cena. Řeší se to způsobem: o jak velký zásah jde? Vejdeš se do 3 dnů? Pak je cena 10kSk (něco musí vydělat i majitel, ne? :)) A potom buď jedete na jedné lodi o výdělek nebo prodělek se podělíte nebo nejedete na jedné lodi a pak je lepší použít úkolovou mzdu. On se pak i tem programátor pochlapí v odhadech :).
Jinak sochat program není to samé jako sochat pračku. Problémy, které mohou nastat v průběhu realizace, nemusí odhadnout ani velezkušený analytik, takže říct, že je to jeho chyba je dost drsné. Je to podobné jako odhad délky cesty z Prahy do Bratislavy. Člověk se koukne do navigace, zjistí, že tam za 4 hodiny bude a nakonec stojí před Brnem půl dne kvůli rozlité kyselině a je to jeho chyba?
Tak tak, přesnost odhadu záleží na velikosti projektu a pak také na zkušenosti programátora. Někdo nechce dávat termíny, protože má tendenci podceňovat (to dělají skoro všichni :)) a pak se zadře na nějaké blbině (to dělají taky skoro všichni :)). Odhadnout alespoň trochu přesně časový úsek/cenu pro tvorbu/úpravu/opravu programu po oznámení jména toho projektu :) je zatraceně těžké. Minimálně to chce hrubou analýzu a to může trvat i několik dní/týdnů - a stejně něco, co zásadně mění skoro všechno, se člověk dozví až když ukáže prototyp atd. No a nejlépe se odhaduje doba/cena při použítí hotových/koupených komponent.
Jednak můžeš vždycky použít klasické FTP příkazy přes obyčejný socket http://en.wikipedia.org/wiki/List_of_FTP_commands a samozřejmě můžeš použít google, protože jistě nejsi první, kdo to řešil (první odkaz z googlu http://www.codeguru.com/csharp/csharp/cs_internet/desktopapplications/article.php/c13163).
Jsou 2 možnosti. Tu první ty nechceš :smile1: , a to je nastavení textu pro každé nové zobrazení přes callback. Ve struktuře TOOLINFO místo textu dáš LPSTR_TEXTCALLBACK a následně budeš obsluhovat notifikaci TTN_GETDISPINFO.
Druhá varianta je asi ta, co chceš ty - měnit text v zobrazeném tooltipu. Na to bude asi nejlepší ukázka funkčního kódu změny textu:
TOOLINFO sToolInfo;
wchar_t wzTemp[128]
sToolInfo.cbSize = sizeof(TOOLINFO);
sToolInfo.uFlags = TTF_TRACK;
sToolInfo.hwnd = NULL;
sToolInfo.hinst = NULL;
sToolInfo.uId = 0;
sToolInfo.lpszText = wzTemp;
sToolInfo.rect.left = 0;
sToolInfo.rect.top = 0;
sToolInfo.rect.right = 0;
sToolInfo.rect.bottom = 0;
::SendMessage(m_hIconicTooltip, TTM_UPDATETIPTEXT, 0, (LPARAM)(LPTOOLINFO)&sToolInfo);
::SendMessage(m_hIconicTooltip, TTM_TRACKACTIVATE, true, (LPARAM)(LPTOOLINFO)&sToolInfo);
Jednou při vytvoření musíš samo volat TTM_ADDTOOL atd.
Když jsem ti chtěl napsat ukázku kódu, tak jsem asi přišel na tvůj problém :). Je to tento řádek
this.InitializeComponent(); // zaciname znovu
v button2_Click. Tím si vytvoříš nové instance všech ovládacích prvků. Pokud chceš jenom vymazat obsahy editačních polí, nastavit texty ve statickém textu, změnit stav tlačítek atd. tak to musíš udělat jinak (nejlépe vlastní funkce, která bude výchozí stav tvořit). Když to opravíš, tak ti bude fungovat i tvůj stávající postup. Jinak ten mnou navrhovaný způsob:
private void button2_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.InstanceRef = this; //ulozim si instanci formu1
Turnaj.Tur.Clear(); // vymazu udaje o turnaji
form2.ShowDialog();
// s podminkou na hodnotu ve form2
if (form2.nějaká tvoje property)
{
button1.Enabled = true;
}
}
Z úkazky kódu není patrné, proč by to nemělo fungovat, ale jednu věc změnit můžeš. Máš form1, v něm zobrazuješ form2 jako modální, nebo-li se k formu1 po dobu zobrazení formu2 nedostaneš. Takže pokud chceš změnit nastavení formu1 dle čehosi ve formu2, tak to nemusíš dělat přes referenci, ale po skončení ShowDialog kouknout na nastavení ve formu2 (nějaké vlastní instanční proměnné) a podle toho změnit nastavení ve formu1.
Tvoje původní otázka se týkala stavu, kdy při ukončení chceš uložit stav (někam) a při startu ho zase načíst. Soubor je správně, serializace je jedna z možností, jak dosáhnout kýženého o něco snadněji. Principem serializace je uložení/načtení v jednom "balíku". Můžeš to zkusit ohnout přes rozhraní typu ISerializable nebo přes XmlSerializer, ale nejsem si jistý, jestli dosáhneš stavu, který chceš.
Pokud chceš mít ukládání na etapy, mít v podstatě maximální kontrolu na ukládáním, čtením, mazáním, přepisováním, tak to už spíše vede na "normální" soubor. Asi si budeš muset ujasnit, co vlastně chceš.
V podstatě si to měl dobře, jen to vlož do jednoho try bloku, něco jako:
try
{
sql.Open();
cmd = new SqlCommand(select, sql);
reader = cmd.ExecuteReader();
// ... atd.
}
catch (SqlException e)
{
Console.WriteLine(e.Message);
}
finally
{
sql.Close();
}
V try bloku nemusí být jen ty části, které vyhodí vyjímku.
V konstruktoru Hra tu chybí inicializace jednotlivých prvků pole poleHráčů, něco jako:
for (int i = 0; i < poleHráčů.Length; i++)
{
poleHráčů[i] = new Player();
}
BTW: možná je to jenom můj předsudek, ale diakritika v názvech tříd, funkcí, proměnných .... :smile19: