Zdravím, potřeboval bych radu. Pro svůj program potřebuji použít jednu průmyslovou kameru, na webu výrobce k ní dodávají SDK s API funkcemi pro kameru, bohužel je to v jazyku C, zde je základní definice z manuálu (MUCam_Handle se používá skoro ve všech dalších funkcích např. MUCam_openCamera(MUCam_Handle camera) atd.):
Type Definition
typedef void* MUCam_Handle
The camera object handle type. The handle is the "void *" type, never convert it to "int" or "long", especially in 64-bit operating system.
PROBLÉM: Nevím jak zadefinovat MUCam_Handle ve VB.NET když nesmí být typu integer ani long. Děkuji mnohokráte za jakoukoliv odpověď.
Zde je ke stažení manuál s API funkcemi a definicemi: http://leteckaposta.cz/746735633
Příspěvky odeslané z IP adresy 92.62.224.–
Ahoj, vítej na fóru :)
notifyIcon1.ShowBalloonTip(3000, "hlavička",
"text",
ToolTipIcon.Info);
čtvrtý parametr je to co hledáš?
Máš na výběr z enumerace ToolTipIcon http://msdn.microsoft.com/en-us/library/system.windows.forms.tooltipicon.aspx. Pokud chceš použít nějaký vlastní, tuším že se to dělalo přes Marshal a externí volání Win32, ale jak přesně to z hlavy nevím... Jestli tě to zajímá můžu to najít.
Edit: Počkej, teď jsem si to přečetl znovu a ty chceš změnit standartní... Tak to jsem teď asi trochu urazil tvojí inteligenci a sry :D
Edit2: Mno, tak jsem to nenašel... :(
To PeterM : Zkus, uvidíš.
Jestli jsi jako já línej pouštět Visualko, tak... To neprojde při kompilaci. Bude ti to říkat že některé položky interface nejsou vyplněny a app se prostě nezkompiluje. Je to logické, protože když už jsi implementoval interface, může přes něj k tobě kdokoliv přistupovat. Takže je to vlastně to samé, jako by jsi napsal this.MetodaKteraNeexistuje() - taky ti to neprojde :)
To alp : np :)
Hezký den :)
To PeterM : Jop, správně :) To by se dalo označit za "základní použití" -- další třeba je... eee... Komunikace mezi dll, pluginování... Představ si systém na načítání plugin (bezva funkční příklad: http://programujte.com/?akce=clanek&cl=2006041802-C%2523-aplikace-s-podporou-pluginu-c - i když jsem v něm svého času krapet tápal co je ten parametr u CreateInstance() ;) ). Tobě je vlastně jedno co daná plugina bude provádět, potřebuješ jí ale ve správný čas říct "dělej co umíš". Takže si vytvoříš sérii několika interface, šoupneš je do vlastního .dll a všechny pluginy budou importovat jen tuto knihovnu. Core aplikace pak každou jednu pluginu používá jen přes interface - jen přes to, na čem jsi se "domluvil" pomocí interface. Core prostě nemůže tušit co je v každé jedné plugině... Když bude v plugině "mojeUzasnaMetodaKteraHackneInternetDoDesetiSekund(string kdeZacit, string jmenoPritelkyne)" tak je ti to úplně na nic, protože core nemá křišťálovou kouli aby zjistilo že jí má někdy zavolat.
Nebo, jiný příklad, představ si že plugina potřebuje přístup k databázi. Tak jednoduše implementuje rozhraní "IWantDB" kde je definice nějaké vlastnosti "IDb Database{set;}" - Core pak zkusí každou jednu pluginu přetypovat na tohle rozhraní a jestli se to povede (nevyhodí to vyjímku, try catch, klasika...) tak použije metodu "_instancePluginy.Database = xxx" - a plugina dostane co potřebuje.
Tyhle interface použité v pluginách musí být samozřejmě předem domluvené - volání metod z nich je natvrdo nakódované v core a žádná plugina je z logiky věci nemůže změnit. Respektive teda může (přepíše natvrdo celé .dll s interfacema) ale core bude volat stejně jen ty metody z těch interface které zná (a nebo celá aplikace spadne, pokud nějakou umazal a ty jí, neexistující zavoláš - při kompilaci by to neprošlo, ale stačí kdyby někdo prostě zkompiloval .dll zvlášť a jen přepsal soubor. To je už takovej extrémní případ a na 99% jde o zpackanej a dost ubohej (nebo naprosto geniální :) ) pokus o hack nebo čiré amatérství), prostě jen ty které jsi v něm ty sám někde v kódu nadatlil.
To alp : Přesně tak. Až na to "výchozí rozhraní" - nic takového neexistuje, "object" nic neimplementuje :) Prostě to spadne na pokusu o přetypování na rozhraní. To s tím Sort() je jen příklad, v frameworku je milion dalších použití. A v příkladě pro PeterM, s pluginama, to vlastně ani jinak nejde, než komunikovat přes interface. A miliony dalších věcí které mě zrovna teď nemůžou napadnout :)
"Hledá" je možná moc nadvznesený výraz, prostě to zkusí přetypovat (object x, y; try{((IComparable)x).CompareTo(y);} catch {throw new Exception("Je třeba implementovat IComparable!");} -- a je dost možné že se ani s tím přepsáním Exception na srozumitelnější nezdržuje :) ) a hotovo.
Interface je vlastně takové "hele, kámo, je mi totálně jedno co nebo čeho jsi za instanci, tady máš seznam věcí které po tobě můžu chtít". V příkladě nahoře, IComparable, jde o .net frameworkem předdefinovaný interface který říká konkrétně o "Hele, když ti řeknu 'object Á' tak buď schopnej mi říct zda jsi větší, stejný nebo roven, jo?" - a tuhle větu použije třeba zrovna metoda "Sort()" u Listu. Ale prakticky může jít o cokoliv, nejen pro porovnávání. Třeba "Hele kámo, chceš se nějak vykreslit? Tak si udělej metodu 'Draw(GraphicContext gr);' a až budu potřebovat kreslit tak se ti přes ní ozvu." Et cetera et cetera...
BTW: Autor tohoto příspěvku před napsáním přišel z hospy, kde měl tři pivka s kámošema. Snad píše srozumitelně :)
BTW2 a edit: Slovíčkaření... Interface se "implementuje", dědičné věci (abstraktní třídy, Form ( :) ) atd) se "rozšiřují". V javě se to musí psát "implements / extends", v c# se píše jen dvojtečka, což někdy může být matoucí (na první pohled nepoznáš jestli kolega rozšiřoval nebo implementoval), proto je také dobré začínat jméno interface písmenem velké i - "I". Někdy jsou výsledná jména kouzelná, viz třeba to "IWantDB - Já chci DB" :)
No jestli to bude fungovat... Záleží co s tím budeš chtít dělat. U IComparable předpokládám že řadit :)
Příklad #1:
Budiž tedy program co řadí obdélníky podle obsahu (to už skoro máme ;) ). Budiž List<Obdelnik> s několika instancemi obdélníku.
Jelikož jsem si podctivě vyplnil IComparable, stačí mi teď na na onom Listu zavolat metodu "Sort()" a voila, je seřazeno :)
Pokud mám vlastní implementaci, musím projít celou kolekci a použít třeba quick sort pro řazení podle mé metody. To je hafo psaní navíc, ale v takovémhle příkladě se to ještě dá.
* * * *
Příklad #2
Zatím nuda a rozhraní skutečně netřeba. Uděláme si to trošičku komplikovanější - ale myslím že dobře uvidíš sílu interfacu. Budiž tedy program co řadí obdélníky, čtverce, trojúhelníky, kosočtverce, kosoobdélníky, sudokopytníky a lichokopytníky, hrnce a kastroly, knihy a stromy a domy ( ;) ) podle obsahu.
Pokud si u všech podstivě implementuju IComparable, můžu v klidu řadit všechny najednou.
Vsuvka:
Obdélník jak jsi ho popsal ty, budu tedy muset lehounce přizpůsobit (nepůjde přetypování na "Obdelnik" protože až bude "other" třeba sudokopytník, spadlo by to) ale elegantně si pomůžu jedním interfacem navíc:
public interface IHaveObsah : IComparable{ // Je docela hloupé používat takovejhle česko-anglickej mix jmen, ale příklad.
int Obsah{get;}
// int Obvod{get;}
}
Tenhle interface také implementuji (stačí ho přidat do hlavičky protože už jsme ho vyplnili) a změním řádek
Obdelnik other = (Obdelnik)obj;
na IHaveObsah other = (IHaveObsah)obj;
Konec vsuvky
Nyní tedy budiž List<IHaveObsah> do kteréhu nacpu všechny věci:
List<IHaveObsah> list = new List<IHaveObsah>();
list.Add(new Trojuhelnik(40,30,20));
list.Add(new Trojuhelnik(50,10,20));
list.Add(new Sudokopytník("íhahaaa"));
list.Add(new Dum(VelikostDomu.velký)); // jsou to jen příklady ;)
list.Add(new Ctverec(40,30,20,60));
list.Add(Tree.GetOak());
list.Sort();
První kouzlo: List má jako generikum Interface. Pokud všechny tyto třídy tento interface implementují, můžu do něj všechny tyhle instance v klidu nacpat.
Druhé kouzlo: Protože IHaveObsah rozšiřuje IComparable (dědičnost, klasika...) bude Sort() fungovat. Kdyby jsi chtěl vlastní implementaci (volat nějakou metodu která není kryta žádným interfacem), tak se asi zblázníš, protože jde o strašně moc druhů objektů.
* * * *
Jasná? :)
Trošičku posthunt (už jsem myška! :D ), ale k věci:
Skalární fce vypadá nějak třeba takhle:
CREATE FUNCTION dbo.ScalarFunction()
RETURNS BIT
AS
BEGIN
RETURN 1
END
Tahle je hodně triviální, vrátí jen true :)
Query na ní bude "select dbo.ScalarFunction() as vzdyTrue;"
Table-valued funkce vrátí celou tabulku a vypadá kupříkladu takhle:
CREATE FUNCTION dbo.DataProTiskFaktury (@idFaktury int)
RETURNS TABLE
AS
RETURN SELECT Faktury.id, Faktury.datum, Faktury.splatnost, Polozky_objednavky.mnozstvi,
Zakaznici.jmeno, Zakaznici.prijmeni, Zakaznici.ulice, Zakaznici.cp, Zakaznici.mesto,
Zakaznici.PSC, Kvetiny.rodovy_nazev, Kvetiny.druhovy_nazev, Kvetiny.jednotka_mnozstvi, Kvetiny.cena
FROM Faktury INNER JOIN
Objednavky ON Faktury.objednavka = Objednavky.id INNER JOIN
Polozky_objednavky ON Objednavky.id = Polozky_objednavky.id_objednavky INNER JOIN
Zakaznici ON Objednavky.zakaznik = Zakaznici.id INNER JOIN
Kvetiny ON Polozky_objednavky.zbozi = Kvetiny.id
WHERE (Faktury.id = @idFaktury);
Na tuhle bude query "select * from dbo.DataProTiskFaktury(1);" (je z jednoho hodně starého projektu do školy)
Pak jsou ještě inline fce ale přiznám se že těm moc nerozumím.
Nemyslel jsi to takhle nějak?
var _connection = connection; // ...
SqlCommand cmd =SqlCommand("SELECT ScalarFunction(@prvni, @druhy) as blabla;", _connection); // vlastni query
cmd.Parameters.Add("@prvni", SqlDbType.NVarChar).Value = "ahoj"; // parametr jedna co tam posilam
cmd.Parameters.Add("@druhy", SqlDbType.NVarChar).Value = "světe"; // parametr dva
bool jaktotedaje = (bool)cmd.ExecuteScalar(); // scalar - vrátí první
Totiž ta Query co psal Chrasty je jen pro table-value funkce - funkce ktera vrátí celou tabulku. Pozor ale:
Ty jsi ale psal "které vyhledají data v databázi s návratovou hodnotou True / False." což je trošinku zavádějící :-/
Pokud má fce návratovou hodnotu třeba BIT (tzn právě true nebo false) nebo jakoukoliv jinou - za předpokladu že je jen jedna jediná - mluvíme o "skalárních (ang Scalar) funkcích" a ty se volají jak jsem ti napsal v příkladě ( select fce(); ). Podle tvého popisu jsem napoprvé pochopil že takovou fci máš, kupříkladu kontroluje zda jsou data třeba přítomná a vrátí "ano, tenhle záznam tu je/ne, záznam tu není." nebo tak.
Pokud ovšem jsi chtěl říct "tabulku s hodnotamy true nebo false" - "table-valued funkci" (tedy těch true / false bude třeba milion) tak k vlastní fci skutečně přistupuješ jako k tabulce a voláš nad ní select jako nad jakoukoliv "fyzickou" a platí přesně to co napsal Chrasty.
Nejlepší by bylo kdyby jsi sem poslal tu svou db fci ať na to můžem mrknout.
Edit: Jéééé, tímhle postem level myška! :D
Je to vlastně docela jednoduché... Moc jsem nepochopil ten tvůj příklad, ale zkusím to nějak vymyslet:
V tomhle příkladě třída Zakaznici při přidávání nového zákazníka zkontroluje jestli je ID rovno stu - pokud ano, vypálí event (to je to na co se tu asi ptáš...) a pokud ne, tak přidá delegáta na Zákazníkovu metodu "AzBudeStoZakazniku" na event. Jde jenom o ukázku, delegáti se budou přidávat každému zákazníkovi (vyjma toho stého) i poté co už event nikdy nenastane (zákazník s ID 101+ už ho nikdy nezažije, přestože bude k eventu přihlášen ;) )
public delegate void MujStyZakaznikDelegat(Zakaznik kterejToJe); // delegát, vrací void a jako parametr posle prave toho zakaznika....
public class Zakaznici{
public event MujStyZakaznikDelegat MujStyZakaznik; // vlastní event
public void PridejZakaznika(Zakaznik zakaznik){ // tohle je jen priklad, tady prave netusim jak to mas uz napsane :)
if(zakaznik.ID == 100){ // kontrola zda se jedna o steho zakaznika...
this.OnMujStyZakaznik(zakaznik); // Kdyz ano, vypálíme event.
} else { // pokud sty neni, pridame ho k "čekajícím"
this.MujStyZakaznik += new MujStyZakaznikDelegat(zakaznik.AzBudeStoZakazniku);
}
}
private internal virtual void OnMujStyZakaznik(Zakaznik zakaznik){ // tradiční pojmenování pro funkci která vypálí event je On<JmenoEventu>
if(this.MujStyZakaznik != null){ // pokud k eventu neni nikdo prihlasen spadlo by nam to s null exception.
this.MujStyZakaznik(zakaznik); // Vypálíme event - a to tak ze ho vlastne zavoláme.
}
}
}
public class Zakaznik{
public int ID{
get;
protected set;
}
public void AzBudeStoZakazniku(Zakaznik zakaznik){
//blablabla
}
}
Psáno z hlavy, jsem línej pouštět visualko ;)
Vlastní event žádné tělo nemá, jen se k němu přihlásí n delegátů (proto se při přidávání používá "+=" a ne "=" ;) ) a ty se pak zavolají všechny najednou. Myslím že odpověď na tvojí otázku je zahrnuta v metodách "PridejZakaznika(Zakaznik zakaznik)" a "OnMujStyZakaznik(Zakaznik zakaznik)".
To Petrroll : Ne vždy je LINQ k dispozici...
Pokud jsem to správně pochopil chceš aby byla jména unikátní, ne? Potom máš ale nejlepší hodit si na sloupec s jménama prostě a jednoduše unique index - a c# ti pak při vzniklé duplikaci vyhodí vyjímku, tu chytneš a řekneš bfu ať si změní jméno...
Dělá se to tak, že v Server Exploreru klikneš Pravým myši na sloupec který chceš a vybereš "Index/Keys" (nebo tak nějak) a tam už si snad poradíš :)
Pokud ne, tak triviální query:
SELECT COUNT(*) AS pocet FROM [tabulka] WHERE meno='Peter';
vrátí počet řádků s jménem Peter :)
Kdyby jsi chtěl bejt drsnej tak si můžeš napsat skalární funkci:
CREATE FUNCTION dbo.JeVDB(@jmeno varchar(50))
RETURNS BIT
AS
BEGIN
DECLARE @value INT
DECLARE @result BIT
SELECT @value = COUNT(*) FROM
[tabulka] WHERE meno = @jmeno;
IF(@value = 0)
BEGIN
SET @result = 0;
END
ELSE
BEGIN
SET @result = 1;
END
RETURN @result;
END
a pak query bude jen takováhle:
SELECT JeVDB("Peter") AS jetamneboneni;
No a pak v c# zavoláš na sqlcmd.ExecuteScalar()
Ale to už je jak s kanonem na vrabce a dávám to sem jen pro zajímavost :) Nejlepší řešení je asi ten unique index.
Jo a píšu to z hlavy, takže možná je tam někde chybka...
Hůř, 35 MB :) Jde o to že to je úplně obyč člověk co s ním chodím na pivko a fotbal a sice ví kde se pouští počítač ale... Prostě když to zastaví jeho, tak pro nějakou sekretářku to může být nepřekonatelný problém. Ne všichni vědí že "framework" není vulgární nadávka. Sekretářka má alespoň systémáka kterej udělá hromadnou instalaci, ale jako sw "pro obyč lidi"... Nevím jak to popsat.Stáhnout nějakých 50 MB může jen těžko někomu ublížit
Přesně to se snažím celou dobu říct a uvést na příkladech. A já se těšil na flame :D No, snad příště ;)Říkat něco ve stylu "dotnet ruleeezZzZz!!!!", je strašně omezený. Myslím, že to není nikdy na místě.
To Petrroll :
Jenom drobnost... Je to starší vlákno ale proč to tu nechávat s chybou...
Správně je to takhle
delegate void mujDelegat();
event mujDelegat mojeUdalost = new mujDelegat(mojeMetoda);
a (nebo :) )delegate void mujDelegat();
event mujDelegat mojeUdalost = mojeMetoda;
Prostě do ukazatele se nepíší parametry() - protože ty už jsou definované jako parametry delegáta a target musí být v parametrech totožný.
Nevím, jestli jsi to jenom nevynachal kvůli příkladu, ale pokud by se sem někdy někdo progooglil tak ať je to komplet: pozor na to
event mujDelegat mojeUdalost = new mujDelegat(mojeMetoda);
To si můžeš dovolit při inicializaci (vyhneš se NullReferenceException kdyby jsi vypálil event a neměl na něm žádného delegáta, většinou se ale event před vypálením kontroluje zda != null místo aby se na něj věšel prázdnej delegát...) jenže pokud by jsi na něj chtěl navěsit víc delegátů, jako třeba
delegate void mujDelegat();
event mujDelegat mojeUdalost;
// tělo metody:
mojeUdalost = mojeMetoda1; // nebo mojeUdalost = mujDelegat(mojeMetoda1);
mojeUdalost = mojeMetoda2; // atd
mojeUdalost = mojeMetoda3;
mojeUdalost(); // tím jsem vypálil event
tak se logicky provede pouze mojeMetoda3, protože první dvě jsou přepsány. Pokud chceš na event navěsit víc delegátů než jednoho (občas se to hodí :) Nakonec, je to přece event, ne? Jinak by stačila obyč proměnná s typem mujDelegat ) tak stačí = nahradit za +=
delegate void mujDelegat();
event mujDelegat mojeUdalost;
// tělo metody:
mojeUdalost += mojeMetoda1; // nebo mojeUdalost += mujDelegat(mojeMetoda1);
mojeUdalost += mojeMetoda2; // atd
mojeUdalost += mojeMetoda3;
mojeUdalost(); // tím jsem vypálil event
a teď proběhnou všechny tři metody.
To djanosik : Penetrace: No, a to já mám právě historku s kamarádem kterého už lehce přes rok spamuju "aby si to konečně sosl" a ještě nebyl schopnej / ochotnej i když měl na icq link už mockrát. Jsou prostě lidi kteří zabrzdí kvůli dososávání frameworku.
Blahé paměti a dle wiki* je .net out-of-box jen v Vista (3.0) a W7 (3.5) a ruku na srdce, XP má pořád strašně moc lidí.
WPF je mocný nástroj, bezesporu, ale začátečníka může právě proto docela dobře ubít. To mi nevymluvíte. Naučit se pořádně WPF není otázka pár hodin a pan Jakub se ptal na jazyk a ne gui hejblátka :) Když už jsme u toho psaní nových (forms) prvků, ještě bych podotkl že i .net codebase obsahuje několik bugů s ktrerými se nikdo od Microsoftu neobtěžoval** a vlastně tak jen házej klacky pod nohy.
Trochu zkoriguju sám sebe... Zabíhat do tvorby forms prvků je trochu extrém, připouštím, hlavně pro začátečníka - mělo to sloužit jako porovnání s javou, kde je toto vyřešeno mnohem jednodušeji. Chci tím jen taktně naznačit že se rozhodně nedá říct "dotnet ruleeezZzZz!!!!11" protože všechno má svá slabá místa.
Ale to už jsme strašně daleko od původní otázky - prostě a jednoduše, smysl to má, určitě ano :) Jen všechno není absolutně dobré nebo absolutně špatné.
To Krychlik : Zajímavý odkaz :) To mi skutečně uniklo...
*viz http://en.wikipedia.org/wiki/.NET_Framework#Versions
**viz http://objectlistview.sourceforge.net/cs/blog3.html
Lets Flame begin :)
U .net počítej s tím že když si tvou aplikaci bude chtít pustit kámoš s OS jiným než w7 (kde je framework předinstalovaný) budeš ho muset ještě donutit stáhnout cca 35MB .net redist - občas je to těžší než by se mohlo zdát :) Pro javu platí to samé, třeba pro c++ ne :)
Taky je trochu problém že .net je ve svém jádru "tajné" - neuvidíš jak fungují vnitřnosti* a třeba takové vytvoření vlastního GUI prvku (nemyslím komponenty ale zcela nového prvku - třeba kulatý checkbox :) ) je pak docela porod. Taková Java je v tomhle na úplně jiném levelu, a i když jsou některé implementace tajné (proto třeba linux není distribuován s javou...) v praxi jsem na ně nikdy nenarazil a vesele se šťoural ve zdrojáku frameworku :)
Pokročilá grafika... .NET je v grafice zvláštní. Jako vlajkovej framework microsoftu se v něm nedá dělat** s DirectX (podpora D3DX skončila před dvěma lety...) takže buď OpenGL a nebo (někdo říká že pomalé) wpf (pozor, wpf je sice mocný nástroj ale do nějakého pokročilého 3d bych se s ním rozhodně nepouštěl - nějakej graf či křivku klidně...). Java má několik implementací OpenGL (DirectX bez šance) a není problém.
Jinak jestli se chceš začít učit... Myslím že s .net není problém. Nás na vejšce první naučili s Javou a pak až s .net ale z praxe můžu říct že když umíš s jedním umíš po dvou minutách i s druhým.
Ono není zas tak důležité naučit se datlit kód, jako samotný návrh a architektura projektu. Ve chvíli kdy povyšuješ proměnné které jsi měl jako instanční na statické bývá něco špatně s OO návrhem :) ) Je sice pěkné že hned po "hello world" si naprogramuješ batch run (třeba, prvni co me napadlo :D ) ale u větších projektů to prostě není o datlení.
Rozhodnutí je jen na tobě :)
Hezký den :)
*s .net reflector uvidíš, disassembly do zdrojáku, príma věcička a free :)
** dá, můžeš použít sexy XNA framework - ten je ale zaměřený na hry, pokud potřebuješ jen vykreslit graf je blbý uživateli nutit novej framework.
Nejsnažší je použít SqlConnectionStringBuilder (namespace System.Data.SqlClient) kterej, pokud netušíš jak connestionString vypadá, ho za tebe vytvoří.
SqlConnectionStringBuilder csb = new SqlConnectionStringBuilder();
csb.DataSource = "192.168.1.5"; // adresa databaze
csb.UserID = "db2943"; // jmeno uzivatele
csb.Password = "vbasic"; // heslo
csb.InitialCatalog = "db2943"; // jmeno databaze
csb.IntegratedSecurity = false; // tohle je třeba aby se použilo "jméno a heslo", při true by to bralo windows credentials
SqlConnection cn = new SqlConnection(csb.ConnectionString);
cn.Open();
new SqlCommand("DROP TABLE * :D ;)", cn).ExecuteNonQuery();
Takhle se připojíš z programu, samozřejmě...
Pokud se ptáš na připojení pro správu a tak, zkus Sql Server Management Studio a nebo ve Visualku máš zabudovaný "Server explorer"
Cesty Microsoftu jsou nevyspitatelné :) V VS08 se to zapíná/vypíná Tools - Options - Text Editor - All Languages - General a check na Auto List Members a Parameter Information ;) a myslím že v VS10 to bude podobné nebo stejné.
Stejně by jsi ale měl mít Inteli přístupné na vyžádání - [ctrl] + [space].
Hezký den :)
splite napsal: public databazeOsob() {
databaze = new List<osoba>
}
[/Citace]
Oj, samozřejmě že hned překlep... tady má samozřejmě být:
databaze = new List<osoba>();
a ještě bych to vylepšil touhle vlastností:
public osoba this[int index]{
get {
if(this.database.Count < index){
return null;
}
return this.databaze[index];
}
}
aby jsi potom někde v kódu mohl používat parádní:
databazeOsob db = new databazeOsob();
db.Load();
for(int i = 0; db[i] != null; i++){
osoba obcanKane = db[i];
blablabla;
}
A při 21 osobách ti to spadne :)
Zkus radši generický List...
class databazeOsob {
private List<osoba> databaze;
public databazeOsob() {
databaze = new List<osoba>
}
public void vlozOsobu(string mesto, string jmeno) {
databaze.add(new osoba(mesto, jmeno));
}
public osoba ziskejOsobuDleJmena(string jmeno){
foreach(osoba x in this.databaze){
if(x.jmeno.equals(jmeno)){
return x;
}
}
return null;
}
}
Dále bych chtěl upozornit, že dobrým zvykem je začínat jména tříd velkým písmenem (takže ne osoba ale Osoba, ne databaseOsob ale DatabaseOsob atd) stejně tak public metody, proměnné a vlastnosti :) Narozdíl od Javy, ale i tam se class začínají velkým písmenem...
A pak to ukládání... No, XML by bylo nejlepší, jenomže pro začátečníka nic moc všechny ty childs, parent, sibling etc...
Proč ne prostě .txt s odřádkováním jako delimeter a tak? :)
using System;
using System.Collections.Generic;
using System.IO;
class databazeOsob {
private List<osoba> databaze;
private string mujSoubor = Environment.CurrentDirectory+@"\db.txt";
private bool isSynchro = false;
public databazeOsob() {
databaze = new List<osoba>
}
public void vlozOsobu(string mesto, string jmeno) {
databaze.add(new osoba(mesto, jmeno));
}
public osoba ziskejOsobuDleJmena(string jmeno){
foreach(osoba x in this.databaze){
if(x.jmeno.equals(jmeno)){
return x;
}
}
return null;
}
public void Save(){
TextWriter tw = null;
if(this.isSynchro){
tw = new StreamWriter(this.mujSoubor, false);
} else {
tw = new StreamWriter(this.mujSoubor, true);// to true je tam pro append k stavajicimu textu (jinak by se prepsal stary
}
foreach(osoba x in this.databaze){
tw.WriteLine(x.jmeno);
tw.WriteLine(x.mesto);
tw.WriteLine();
}
tw.Close();
}
public void Load(){
this.isSynchro = true;
StreamReader r = new StreamReader(this.mujSoubor);
string line = String.Empty;
while((line = r.ReadLine()) != null) {
string jmeno = line, mesto = r.ReadLine();
r.ReadLine(); //posun čtecí hlavičky o tu jednu mezeru kterou jsme si oddělili zaznamy v this.Save()
vlozOsobu(mesto, jmeno);
}
r.Close();
}
}
Pisu to z hlavy, takze mozna je tam nejaky preklep... Krasny den :)
Mno, o tom že by se dalo nenápadně ukládat zpět na stanici sní asi každej hacker ;-)
Rozhodně by se dal napsat drobounkej script kterej by takovejhle "náhled" obrázku vnutil (s hlavičkou octet-stream) zpět k downloadu, ale skočilo by ti klasické okno "uložit/otevřít" a to asi není přesně to co jsi chtěl... A navíc, pokud by jsi chtěl aby to nebyla poslední věc co usr na tvém webu udělá, stejně by jsi musel ten obrázek uložit někam do cache na hdd.
Myslím ale, že skutečně řešíš něco jiného než by jsi měl, IO příkazy (nebo BLOB v sql pro ty co v ně věří :-) ) nejsou zas tak pomalé a smysl je má řešit až při opravdu velkém množství uživatelů ukládajících v jednu chvíli (a to tak že koupíš lepší řadič na server :-) ).
Jinak celkově mi to přijde jako hloupost. Kupříkladu, co uděláš v případě kdy data nahrál z práce a teď na to kouká doma?
Dobrý večer. Mám problém se zvuk na výše uvedené konfiguraci. V základní verzi funguje vše bez problému, ale jakmile nainstaluju aktulizace, přestane mi fungovat zvuk z bedýnek. Při obnovení systému do doby před aktulizacemi vše jede v pohodě. Na internetu jsem viděl podobný případ jen dvakrát, ale obojí bez odpovědi. Máte s tím někdo zkušenosti?
Zdravím. Objevil jsem ve Win7 položku kontakty a hned jsem si tam začal přidávat kontakty, vč. telefoního čísla. Teď jsem zjistil, že mohu na ta čísla z notebooku volat. Nevíte někdo, jak je tohle ošéfovaný, resp. kolik se za to platí a jaká jsou omezení? Děkuji.
To gatuso : Rodina .NET, ale jinak i ta Java. I když si nemyslíém, že se hodí na rozsáhlejší projekty (Napadá mě teď program Vuze (Azureus), který je psán v Javě a žere na svůj program dost systémových zdrojů (je ale možné, že to je chyba vývojářů)
Ehm...tohle asi není z článku, co?
Nenašel jsem ani na internetu, co by mohlo slovo "bas" znamenat, google translate si byl taky bezradný.
Slovo Livermore je město. Snad je to v tomhle kontextu.
Takže:
Domácí bas byl domov Ridikovi sestry, Nuchi, a manžela Davida, v Livermore a později jeho (další) sestra Edna a manžel Gary je navštívili z Houstnu, Tx po čtyři dny.
Je to docela kostrbatý překlad, ale ty ho určitě vylepšíš.
Dobrý den. Pořídil jsem si svůj první notebook, Acer Extensa 5635ZG s Win7 Home Edition a mám hned několik dotazů.
1) Moje grafická karta, NVIDA GeForce G105M, nepodporuje DX11, avšak na notebooku je předinstalován. Nemůže toto působit problémy? Nebo grafická karta "inteligentně" zvolí jen ty funkce, které potřebuje a DX zase nepustí to, co nepodporuje?
2) V nastavení je psáno, že notebook obsahuje cituji:
Procesor: Pentium(R) Dual-Core CPU T4300 @ 2.10GHz (2 CPUs), ~2,1GHz
Znamená to, že notebook obsahuje dva procesory o výkonu 2,1GHz, tedy celkový výkon je 4,2GHz? Při rozkliknutí správce HW mi to dva procesory vypisuje, ale ještě jsem neslyšel, že by někde dva procesory fungovaly.
3) Je rozdíl, pokud instaluji do složky Program Files a Program Files (x86)? Pokud ano, jak poznám, kdy mám kam instalovat?
4) Štve mě, když musím spouštět některé programy jako správce (např. cmd). Dá se toto zabezpečení vypnout?
Děkuji za odpovědi =)
Přeji vše nejlepší redaktorům, kteří se vás snaží aktivně vzdělávat a řešit vaše starosti na poli programátorské i osobní (offtopic ;)).
Přeji vše nejlepší Vám návštěvníkům, bez kterých by tento web ztrácel smysl.
Přeji vše nejlepší našemu Ó ctěnému Curovi, člověka s mnoho zásluhy, který jich nezneužívá.
Přeji vše nejlepší tomuto portálu, ať žije dál, ať Ježíšek nadělí další léta a další návštěvníky a pomůže zdokonalit nás redaktory i Vás návštěvníky.
Přeji vše nejlepší všem, celému tomuto světu. Ale hlavně lásku a zdraví. Co víc člověk opravdu potřebuje? =)
Zdravím. Nevíte prosím vás něco o správě PC přes PHP? Potřebuji ho vypínat, příp. by nebyl na škodu restart a ukončování procesů.
Není problém stáhnout externí knihovny, musí být ovšem předkompilovány (ve formátu dll).
Mluvíme o WinXP. Na serveru běží PHP 5.2.6, Apache 2.2.14 a MySQL nějaká pětková verze.
Články v češtině nebo angličtině.
Pokud něco najdete přes google, prosím o klíčová slova, mně se nepodařilo najít vhodnou kombinaci.
Děkuji za pomoc =)
To JJetmar : Super, díky, už to fakčí =)
Jen dvě otázečky:
Jak to může shodit Apache? Resp. co se stalo?
Dá se cache mazat ručně bez zavření prohlížeče? Jedu na 3.6b5 a našel jsem jen možnost mazání po zavření prohlížeče (no, pořád lepší něco, než nic)
Ještě jednou díky =)
Zdravím. Prosím vás, jak je možné, že Apache zamrzne? Příkaz ping na localhost funguje normálně, ale při načítání webové stránky prostě jen čeká... Žádný zacyklení v tom není, ani když chci dát F5 či jinou stránku, tak to nefunguje. Pomůže jen restart Apache. Už jsem z toho docela mimo, ani nevím co a kde hledat. Takže se spíše ptám, nesetkal jste se s tím někdo? Děkuji.
Jsou dvě možnosti. Buď server bude jen prostředníkem, tz. že klient pošle požadavek na server od adresu cílového počítače, ten jej doručí zpět klientovi a pak probíhá komunikace přemío. Nevýhody i výhody zjevné.
Druhou možností je, že klient pošle požadavek i se zprávou, server zjistí cílovou adresu, uloží ji pro probíhající spojení a pošle zprávu cílovému klientovi. Nevýhodou plynou pro klienty, server si může ukládat komunikaci, navíc to může být značně zpomalené, je-li server nadměrně přetížen. Nicméně IP adresa druhého počítače je nezjistitelná, protože se nedostává ke klientovi. Pro server je pak problémem vysoká zátěž.
V obou případech však musí mít klienti unikátní identifikátor. U ICQ je to číslo, u MSN a jabberu je to email.
http://www.builder.cz/art/cpp/tcp_server_windows.html
Máš tam v seznamu i další články zabívající se touto problematikou. Pokud by ti to nevyhovovalo, koukni se po knihovně SDL_Net. Není o ní moc napsáno, ale oficiální dokumentace postačí.
GKW: TCPServer
ad a)Zápis do httpd.conf
Pro domena.org:
<VirtualHost *:80>
DocumentRoot /var/www/virtuals/domena.org/
ServerName www.domena.org
ServerAlias domena.org domena
</VirtualHost>
<VirtualHost *:80>
VirtualDocumentRoot /var/www/virtuals/domena.org/%1/
ServerName *.domena.org
ServerAlias *.domena.org
</VirtualHost>
Autor Jan Mráček
ad b) Buď to můžeš řešit přes mod_rewrite a nebo přes php (na první možnostn ejsem odborník, takže přikládám ukázku v php)
<?
$dom_name = "sub.domena.org";
$url = $dom_name."?";
foreach ($_GET as $key => $value) {
$url .= "$key=$value&";
}
header("Location:$url");
?>
Snad to nějak poběží, netestoval jsem to. Kdyžtak si to trošku pouprav =)
No, nehodlám každý rok měnit doménu =) To číslo totiž určuje ročník, "C" značí technické lyceum a a/b je četa =)
To Spectator : Ty stránky nehodlám provozovat na reklamu =) Potřebuji peníze jen na doménu a to klidně budu sponzorovat, web pojede na serveru školy =)
To Chrasty : To nezní nejhůř. =)
To marioff : Co ta zkratka (čekám, že je to zkratka) znamená?
To pc_manik : I s editem bych to na soldiersplanet neviděl =) Pod tímhle názvem bych si spíš představil nějaký portál pro zaměstnance AČR, než pro vojenskou třídu =)
Člověk při zpětném pohledy do minulosti je rád, že věnoval tomuto portálu tolik svého času, který vlastně promarněný nebyl. Nevím, kde jinde bych se mohl ptát a téměř jisté čekat nenaduté odpovědi od malých debilních adolescentních výrůstků. Abych však nelezl do vod, kam se podívat nechci, raději k otázce, která je zmíněná již výše.
Zakládám třídní stránky na vojenskou střední školu a nemohu přijít na název domény. Napadá vás něco? Jazykové verze: Cze, Eng
Zdravím. Vytvořil jsem pomocí ajaxu script s id scriptLoader. Tento script dle FireBugu opravdu existuje. Avšak potřebuji kód v něm uvedený zobrazit na stránku samotnou. To se mi bohužel nedaří. Pročesal jsem kde co, ale ani moudrý google mi nic relevantního nevyhodil. Přikládám tedy kód:
<html>
<head>
</head>
<body>
<script>
var hlavicka = document.getElementsByTagName('head')[0];
var dataLoader = document.getElementById('scriptLoader');
if(dataLoader) hlavicka.removeChild(dataLoader);
script = document.createElement('script');
script.id = 'scriptLoader';
script.src = 'det_ali.php';
x = document.getElementsByTagName('head')[0];
x.appendChild(script);
</script>
<div id="test">
</div>
<script>
script = document.getElementById('scriptLoader');
text = document.getElementById('test');
text.innerHTML = script.innerHTML;
</script>
</body>
</html>
Nefunguje mi vybrání dat ze scriptu pomocí script.innerHTML. Nějaké jiné návrhy?
Pozn: Nahrazení script.innerHTML jakkýmkoliv jiným textem funguje.
Zdravím. Nemohli byste doporučit nějaké hry s opravdu těžce propracovaným příběhem? Budiž nám příkladem naše stará dobá Mafie. Jde mi opravdu o příběh, žánr mě nezajímá a grafika víceméně taky ne (avšak oželel bych MS DOS hry ;)). Jediné, co nechci, je klikací adventura (leda by to byla "fááákt hustáá peckáá") a logické hry - chci relaxovat, na logiku mám jiné obory.
Díky =)
Editoval survik1: Prosím o PC hry =)
To Tomas : Jo, jenže tohle se snaží řešit i oni sami. A jak jsem řekl, muselo by se to dělat BOTy, takže automatická registrace na warezfora (detekce asi podle copyrightu), tam obejít CAPTCHU a následně projíždět celé fórum a detekovat existující linky. Ty pak manuálně přebrat, roztřídit a podezřelé linky hlásit. To je vcelku náročný. Nevím, kdo by si takhle troufnul na univerzálního BOTa. I když, ne že by mě to nelákalo xD
Nicméně, ty jim to smažeš a oni to repuloadnou. Pak dostane tvůj BOT IP BAN. Ovšem, pokud by se dalo nějak postupovat právě proti těm, co to tam uploadli..to je totiž porušení zákona...
Jak jsem řekl, nápad je to dobrý, ale musí se vyřešit poměrně dost much ;)
Tak to vezmeme postupně
ad a) Naše současná jurisdikce je proti tomuto slabá. Můžeš jít pouze po materiálu, který se beztak většinou nachází v torentech či na mimostátních serverech.
ad b) Tým je nesmysl. Muselo by se vše automatizovat pomocí robotů.
ad c) U samotných odkazů nic nezmůžeš, ty jsou legální.
Nápad dobrý, ale chce to dotáhnout a především, nic nevzmůžeš bez změny zákona (který se však již připravuje)
Vývoj tohoto portálu tenkrát ještě s pohledem nahoru na Root či Živě probíhal tak, že Curo zkrátka psal kurz C++ stylem pro blbé, radil jim a pomáhal. Přidal se Sunmay a byl tu doposud největší kurz o VB. No a jak článků přibívalo a jejich kvalita rostla, přibývalo čtenářů a pak i redaktorů. Změnil se design a šlo to ruku v ruce nahoru. Výslednou podobu vidíš dnes ;) A že tenkrát bylo proti komu stát. (to ještě fungoval i Builder, ne?) A že by tu proběhla nějaká rozsáhlá propagační akce, to si nemyslím ;) Ne tenkrát, pak už něco přišlo ;)
Abych to shrnul. Musíš zaujmout kvalitou. Ať se chceš pouštět do čehokoliv, musí to být kvalitní. Nemusíš mít design A+, záleží opravdu jen na kvalitě materiálu. A nenechat se odradit počátečním nezájmem, lidé tě musí najít. A to chvíli trvá.
To soul_draco : Jednodušše nepochopil teoretickou odpověď, na tom nevidím nic špatného. Hlava mi taky občas nebere ani samozřejmosti. A nezapomínejte, že se jedná o dvě různé osoby. Jedna osoba řeší jak procházet bludištěm a druhá jak nainstalovat pascal. V tom vidím podstatný rozdíl ;)