- Vodafone otthoni szolgáltatások (TV, internet, telefon)
- Crypto Trade
- Router gondok
- Linux kezdőknek
- A lengyelek szerint az Amazon félrevezette a vásárlókat
- Megbénítaná Kína chipgyártását az USA
- TP-Link Archer C5 - AC1200 router
- Telekom otthoni szolgáltatások (TV, internet, telefon)
- Rengeteg pénzt veszíthet az AMD és az Intel
- Hálózati / IP kamera
Új hozzászólás Aktív témák
-
leslie23
tag
Sziasztok!
Egy egyszerű kliensen dolgozom WinFormsban, néhány ablakból fog állni az egész app. Tudom, hogy elavult, meg stb., csak nem akartam fejest ugrani a WPF-be.
A problémám, hogy a formok megjelenítésekor az adatok lekérése (tárolt eljárások) miatt 3-4 sec, mire megjelenik kattintástól számítva egy-egy form. Mit tudnátok javasolni erre?Már az is előrelépés szerintem, ha megjelenik a form, de a DataGridView helyén mondjuk egy loading spinner van, amíg az adatok és a renderelés el nem készül. Olvastam, hogy a BackgroundWorker felejtős, láttam példát async/await implementációra, de érdekelne, hogy általánosságban desktop appoknál szokás-e ezzel foglalkozni és ha igen, akkor létezik-e best practice?
-
Marky18
aktív tag
válasz leslie23 #9451 üzenetére
Az async-await pattern minden GUI-s alkalmazashoz ajanlatos.
En ott kezdenem a kutakodast, hogy miert tart a DB-tol a Viewig 3-4 masodpercig az adatbetoltes? Tarolt eljarasokkal szamolod on-the-fly a betoltendo adatot? Nem lenne egyszerubb ezt DB oldalon letarolni es csak egy jol iranyzott SELECT-el lekerdezni? Mindenkeppen user interakciora kell betoltened az adatot? A lekerdezes elott epited fel a DB connectiont vagy mar elore felepited?
Itt a bottleneck a DB query lesz szerintem, ha azt kikuszobolod es hasznalod az async-await patternt, akkor nem fog varakozni a main thread es a betoltes sem fog masodpercekig tartani. -
leslie23
tag
válasz Marky18 #9452 üzenetére
Jogos a kérdés, maga a tárolt eljárás egyszerű, az adatok mennyisége sem nagy. Viszont a DB nem localhoston van, hanem távoli gépen, amihez VPN-en keresztül csatlakozom. Gondolom ezért, de az SqlConnection.Open 1-1 másodpercre megakasztja a műveleteket, ha debuggerrel megyek végig a kódon.
A kapcsolatot minden lekérdezés előtt felépítem, de ha jól tudom, ilyenkor van connection pooling. Hogyan lehetne másképp? Gondolom nyitva nem tarthatom a SqlConnectiont.
Ami még időigényes lépésnek tűnik az egy foreach a DataGridViewColumn objecteken, közben AutoSizeMode property állítása ColumnName függvényében. Furcsa, de debug mode-ban ez is 1 másodperc mire lefut, pedig eventet nem hívok közben és 12 oszlop (és olyan 50 sor) az egész. -
pmonitor
aktív tag
Érdekes dolog ez az optimalizálás. Én éppen most írtam 1 tesztprogramot tömbök másolásához. Elég érdekes dolgok jöttek ki. Ért 1-2 meglepetés...
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
válasz pmonitor #9454 üzenetére
Nem derül ki, hogy mit akarsz csinálni. És mi alapján választottad ki a bementő paramétereket.
static unsafe void teszt_5(int[] source, int n)
{
fixed (int* pSource = source)
{
int* dest = stackalloc int[n];
int* pSource_0 = pSource;
int* pmax = pSource_0 + n;
for (; pSource_0 < pmax; ++pSource_0, ++dest)
{
*dest = *pSource_0;
}
}
}
(1)
bemegy egy tömb és egy int.(2)A stacken foglalsz egy int tömböt
-ami nem tudja elhagyni a stacket
-és nem lehet nagyobb mint a stack mérete (ráadásul a stackből foglalja a helyet aminek a metódus hívásakor már van egy a metódus számára ismeretlen mérete illetve a default stackméret futtatókörnyezettől is függ)(3)aztán feltöltöd az int[n] tömböt és
(4)elfelejtedHa kézzel írnék tömbmásolásra egy UNSAFE metódust akkor bemenetként a már lefoglalt cél és forrástömb referenciáit vinném be aztán SIMD-del 32 byteonként másolnék (AVX register mérete).
Amit te csinálsz ott egy int* pointert inkrementálsz és int méretben történik az adatmozgatás. (a mivel a ciklusok nem függenek az előzőektől ezért jó esetben 3-4 átlapolva történik meg)
SIMD-del egyedül a memória sávszélessége szabna határt
[ Szerkesztve ]
-
pmonitor
aktív tag
válasz joysefke #9455 üzenetére
Igaz. Közben rájöttem.
Ez lenne talán a reális:
static unsafe void teszt_6(int[] source, int n)
{
int[] dest = new int[n];
fixed (int* pSource = source, pdest = dest)
{
int* pSource_0 = pSource;
int* pdest0 = pdest;
int* pmax = pSource_0 + n;
for (; pSource_0 < pmax; ++pSource_0, ++pdest0)
{
*pdest0 = *pSource_0;
}
}
}Szerk.: És ez már megint csak akkor végez, mint az első esetben(tehát mégsem a leggyorsabb). Azért érdekes, hogy attól, hogy unsafe, még nem optimális kódot lehet vele írni.
[ Szerkesztve ]
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
-
pmonitor
aktív tag
válasz pmonitor #9458 üzenetére
Az egészet arra éleztem ki, hogy a "fő programom"(a cutter) esetében sokat kell tömböt másolni. Igaz, hogy csak kis méretűeket. És ezt rekurzívan kell tenni(ismétléses permutáció generálásához). A Win api CopyMemory() esetén lényegesen gyorsabb lett az ismétléses permutáció generálása(a rekurzív hívásokban lévő tömb másolások gyorsulása miatt.) .
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
válasz pmonitor #9458 üzenetére
static unsafe void teszt_6(int[] source, int n)
{
int[] dest = new int[n];
fixed (int* pSource = source, pdest = dest)
{
int* pSource_0 = pSource;
int* pdest0 = pdest;
int* pmax = pSource_0 + n;
for (; pSource_0 < pmax; ++pSource_0, ++pdest0)
{
*pdest0 = *pSource_0;
}
}
}
mivel a metódusnak visszatérési értéke nincsen (void), a program végeredménye szempontjából lényeges mellékhatás sincsen (nincsen IO, nem változtat semmilyen állapotot) ezért ezért honnan tudod, hogy futás közben release + optimalizáció beállítással ez egyáltalán lefut? (valószínűleg lefut, de nem kéne)
Ráadásul a timert úgy indítod-állítod le, hogy a memóriamásoláson kívül szinte minden tesztesetedben van ciklikus heap allokáció is. Ha nagyot foglalsz a heapen akkor az triggerelhet egy GC futást is.
Mivel a teszt-metódusaidat ciklusban futtatod, az iterációk között teleszemeteled a heapet halott objektumokkal ezért FOG futni a GC, többször, sokszor. A GC futás valószínűleg több időbe kerül mint maga a memóriamásolás. (pld mert a memóriaterületeket valamikor nullázni is kell stb) . Innentől kezdve a méréseid pontatlanok.
Ha memóriát akarsz kézzel másolni, akkor #9455 szigorúan allokáció nélkül. az kimaxolja a mem sávszélt, az a másolás sebességének elméleti határa
====
Az egészet arra éleztem ki, hogy a "fő programom"(a cutter) esetében sokat kell tömböt másolni. Igaz, hogy csak kis méretűeket.
Csak másolni kell a tartalmat egyik helyről a másikra vagy allokálni kell és feltölteni? Elég jelentős a különbség. (nem ismerem a feladatot)
====
A legnagyobb meglepetést azonban az Unsafe kód okozta. Kis méretű tömb esetén a "középmezőnyben" van. Nagy méretű tömb esetén azonban lényegesen a leggyorsabban végez az összes többinél.
Két oka van:
1,
Az eredeti unsafe teszt-metódusodban nem volt for ciklusos heap allokáció hanem stackalloc volt => nincs GC a szemét eltakarítására, összehasonlíthatatlanul gyorsabb. Az összes többi teszt ahol new int[n] hívódik ciklikusan hatalmas handikeppel indult...
2,
Az unsafe kikapcsolja a tömb hozzáférések során az indexer értéktartomány ellenőrzését. ezzel csökkentetted a ciklusonkénti munkát (indexer értékhatár ellenőrzés + mem másolás helyett csak mem másolás). Gondolom a többi library metódus is unsafe-ként van belül megvalósítva. Csak ugye lsd 1. pont[ Szerkesztve ]
-
pmonitor
aktív tag
válasz joysefke #9460 üzenetére
Ha nagyot foglalsz a heapen akkor az triggerelhet egy GC futást is.
De ez az összes többi esetre is vonatkozik(teszt_1-teszt_5-ig). Nem állítom, hogy a teszt atompontos. De többször lefuttattam, és mindig hasonló eredményt adott az egymáshoz viszonyított idők tekintetében.
Csak másolni kell a tartalmat egyik helyről a másikra vagy allokálni kell és feltölteni? Elég jelentős a különbség.
Az optimalizálás 5letét az ismétléses permutáció algoritmusa adta. Ott nagyon sokat kell allokálni és feltölteni(bár a legjobb az lenne, ha csak feltölteni --tehát simán másolni-- kellene).
(nem ismerem a feladatot)
A webhelyemen lévő tesztben allokálok és feltöltöm. A konkrét feladat pedig az ismétléses permutáció algoritmusa(ami a teszthez az 5tletet adta).
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
válasz pmonitor #9461 üzenetére
De ez az összes többi esetre is vonatkozik(teszt_1-teszt_5-ig). Nem állítom, hogy a teszt atompontos. De többször lefuttattam, és mindig hasonló eredményt adott az egymáshoz viszonyított idők tekintetében.
A teszt mér valamit, de nem azt amire te kiváncsi vagy.
Az optimalizálás 5letét az ismétléses permutáció algoritmusa adta. Ott nagyon sokat kell allokálni és feltölteni(bár a legjobb az lenne, ha csak feltölteni --tehát simán másolni-- kellene).
Ha nem kell a mélységi bejárás során keletkező összes tömböt megtartani, csak mindig 1-1 újabbra van szükséged és tudod hogy egy tömbre mikor nem lesz már szükség, akkor érdemes lehet ezt kipróbálni. Ezzel ki tudod küszöbölni a heap allokációt. Én még nem használtam.
[ Szerkesztve ]
-
pmonitor
aktív tag
válasz joysefke #9462 üzenetére
Ha nem kell a mélységi bejárás során keletkező összes tömböt megtartani, csak mindig 1-1 újabbra van szükséged és tudod hogy egy tömbre mikor nem lesz már szükség
Rekurzív hívásokról van szó. Tehát nem mindig csak egyet kell megtartani. Viszont még azt sem lehet előre tudni, hogy egyidőben mennyire van szükség.
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
válasz pmonitor #9463 üzenetére
Ha ez a feladat akkor én itt egyetlen tömbfoglalást sem látok:
Print all distinct permutations of a given string with duplicates - GeeksforGeeks -
pmonitor
aktív tag
válasz joysefke #9462 üzenetére
A teszt mér valamit, de nem azt amire te kiváncsi vagy.
Amíg konzekvensen ugyanazt az eredményt írja ki, addig nekem tökéletes. Ráadásul kipróbáltam. A Cutter programomban az Array.Copy()-t lecseréltem a CopyMemory()-ra, és ugyanazt a tendenciát mutatta, mint a teszt programom. Gyorsabb lett. Tehát sztem azt méri, amit szeretnék mérni. A Cutter program futásakor is "lutri", hogy mikor indul be a GC, tehát még ez is élethűen van a tesztben.
Csak az a baj, hogy(mint ahogy először jól mondtad), a stackalloc a stack-en allokál. Ezt pedig sajnos nem engedhetem meg magamnak(a stack is véges, és mivel nem tudom, hogy egyszerre mennyire van szükségem, ezért ez nem megoldás.), mindenképp a heap-ben kell allokálnom.
[ Szerkesztve ]
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
válasz joysefke #9464 üzenetére
Átírtam C#-ba, meg összehasonlítottam az én kódommal. 5-ször gyorsabb amit Te linkeltél. Jól tudsz guglizni. Köszönöm!
De egyébként ezt is ugyanazzal a módszerrel teszteltem, mint a tömbök másolását. És itt is ugyanolyan konzekvensen mutatta az eredményt, mint ott. Úgyhogy a tesztelés sémájával nincs semmi gond. Azt teszteli, amit tesztelni szeretnék. Ezzel teszteltem:
static void Main(string[] args)
{
tomb = new int[] { 500, 500, 600, 600, 700 };
int max = 5000000;
Stopwatch sw = new Stopwatch();
long t_1 = 0, t_2 = 0, t_3 = 0;
sw.Start();
for (int i = 0; i < max; ++i) Teszt_1(tomb);
t_1 = sw.ElapsedMilliseconds;
GC.Collect();
t_2 = sw.ElapsedMilliseconds;
for (int i = 0; i < max; ++i) Teszt_2(tomb);
t_3 = sw.ElapsedMilliseconds;
Console.WriteLine("{0} {1}", t_1, t_3 - t_2);
Console.ReadKey();
}http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
válasz pmonitor #9466 üzenetére
Átírva C#-ba és használható formában
A kezdeti 1x tömb-klónozáson kívül (hogy ne legyen elrontva a bemeneti tömb) teljesen allokációmentes.
A char[] State tárolja az aktuális állapotot, a bool Next() pedig lépteti az és visszajelez a sikerről. Ha a char[] State állapotot nem csak olvasni akarod akkor értelemszerűen ki kell menteni róla egy másolatot.A char[] State köré lehetne még valami readonly wrappert rakni, de azt nem tudom hogy viselkedne.
char[] megy bele ctor bemeneti paraméterként
És ezen még lehetne gyorsítani.
using System;
namespace Permutator
{
class Program
{
static void Main(string[] args)
{
int i = 0;
var p = new Permutator("abcdananana".ToCharArray());
do
{
i++;
Console.WriteLine(new string(p.State));
}
while (p.Next());
Console.WriteLine($"Nr of results: {i}");
}
}
public class Permutator
{
public char[] State { get; }
int _size;
bool isFinished = false;
public Permutator(char[] symbols)
{
if (symbols?.Length > 0)
{
_size = symbols.Length;
State = (char[])symbols.Clone();
Array.Sort(State);
}
else
throw new ArgumentException("input must be non-empty");
}
public bool Next()
{
// if we have already finished we indicate failure on getting next element
// else we try to advance the state and propagate success of advancing state
if (isFinished)
return
false;
isFinished = !AdvanceState();
return !isFinished;
}
bool AdvanceState()
{
// Find the rightmost character
// which is smaller than its next
// character. Let us call it 'first
// char'
int i;
for (i = _size - 2; i >= 0; --i)
if (State[i] < State[i + 1])
break;
// If there is no such character, all
// are sorted in decreasing order,
// means we just printed the last
// permutation and we are done.
if (i == -1)
return false;
// Find the ceil of 'first char'
// in right of first character.
// Ceil of a character is the
// smallest character greater
// than it
int ceilIndex = findCeil(State, State[i], i + 1, _size - 1);
char tmp = State[i];
State[i] = State[ceilIndex];
State[ceilIndex] = tmp;
Array.Sort(State, i + 1, _size - i - 1);
return true;
}
// This function finds the index of the
// smallest character which is greater
// than 'first' and is present in str[l..h]
int findCeil(char[] str, char first, int l, int h)
{
// initialize index of ceiling element
int ceilIndex = l;
// Now iterate through rest of the
// elements and find the smallest
// character greater than 'first'
for (int i = l + 1; i <= h; i++)
if (str[i] > first && str[i] < str[ceilIndex])
ceilIndex = i;
return ceilIndex;
}
}
}
[ Szerkesztve ]
-
-
pmonitor
aktív tag
válasz joysefke #9468 üzenetére
Én így fordítottam át:
using System;
namespace IsmPerm
{
class Program
{
static int findCeilInt(int[] str, int first, int l, int h)
{
int ceilIndex = l;
for (int i = l + 1; i <= h; i++)
if (str[i] > first && str[i] < str[ceilIndex])
ceilIndex = i;
return ceilIndex;
}
static void Teszt_1(int[] tomb)
{ //https://www.geeksforgeeks.org/print-all-permutations-of-a-string-with-duplicates-allowed-in-input-string/
int size = tomb.Length;
Array.Sort(tomb);
bool isFinished = false;
while (!isFinished)
{
int x = 1, i;
for (int k = 0; k < size; ++k) Console.Write("{0} ", tomb[k]);
Console.WriteLine("");
for (i = size - 2; i >= 0; --i) if (tomb[i] < tomb[i + 1]) break;
if (i == -1) isFinished = true;
else
{
int ceilIndex = findCeilInt(tomb, tomb[i], i + 1, size - 1);
int temp = tomb[i];
tomb[i] = tomb[ceilIndex];
tomb[ceilIndex] = temp;
Array.Sort(tomb, i + 1, size - i - 1);
}
}
}
static void Main(string[] args)
{
int[] tomb = new int[] { 500, 500, 600, 600, 700};
Teszt_1(tomb);
Console.ReadKey();
}
}
}http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
válasz pmonitor #9470 üzenetére
1,
bent maradt a hot pathban a Console.WriteLine() ==> így nem lehet tesztelni. Ha kiveszed sokszorosára gyorsul majd. (csak akkor ugye hol lesz az eredmény )2,
Nem készítesz a bemeneti tömbről másolatot (ami nem feltétlenül baj) de ez azt jelenti hogy a bemeneti tömböt az első futás első iterációja elött egy rendezéssel már tönkreteszed. az algo aztán folyamatosan pörgeti a tömböt míg annak a rendezése át nem fordul (növekvőről csökkenőre)Kizárólag az algoritmus felépítésének köszönheted (és nem a benchmark felépítésének) hogy a tömb amin dolgozol hiába teszed tönkre az algo minden futásával újrarendeződik és így minden futás az első kivételével pontosan ugyanannyi lépést jelent. Az elsőben a qsort ideje különbözni fog a többi futás qsortjának idejétől (de ez elhamyagolható)
-
pmonitor
aktív tag
válasz joysefke #9471 üzenetére
Készítettem az eredeti OOP kódodra egy kis módosítást. Meg Készítettem 2 nem OOP metódust(az egyik static, a másikhoz példányosítani kell). A nem OOP metódusokban Array.Sort()-ok helyett quicksort-ot használtam. Ezek a kódok hasítanak! A kódokban a kiíratásokat kommenteztem ki(na meg az Array.Sort-ok helyét):
using System;
using System.Diagnostics;
namespace TesztConsole
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(DateTime.Now);
//int i = 0;
int jmax = 25000;
Stopwatch sw = new Stopwatch();
long t_1 = 0, t_2 = 0, t_3 = 0, t_4 = 0, t_5 = 0, t_6 = 0, t_7 = 0;
sw.Start();
for (int j = 0; j < jmax; ++j)
{
var p = new Permutator("abcdananana".ToCharArray());
do
{
/*i++;
Console.WriteLine(new string(p.State));*/
}
while (p.Next());
//Console.WriteLine($"Nr of results: {i}");
}
t_1 = sw.ElapsedMilliseconds;
GC.Collect();
t_2 = sw.ElapsedMilliseconds;
for (int j = 0; j < jmax; ++j) new Program().Teszt_qsort("abcdananana".ToCharArray());
t_3 = sw.ElapsedMilliseconds;
GC.Collect();
t_4 = sw.ElapsedMilliseconds;
for (int j = 0; j < jmax; ++j)
{
var p = new Permutator_modositott("abcdananana".ToCharArray());
do
{
/*i++;
Console.WriteLine(new string(p.State));*/
}
while (p.Next());
//Console.WriteLine($"Nr of results: {i}");
}
t_5 = sw.ElapsedMilliseconds;
GC.Collect();
t_6 = sw.ElapsedMilliseconds;
for (int j = 0; j < jmax; ++j) stTeszt_qsort("abcdananana".ToCharArray());
t_7 = sw.ElapsedMilliseconds;
Console.WriteLine("Eredeti: {0}", t_1);
Console.WriteLine("Módosított: {0}", t_5 - t_4);
Console.WriteLine("Nem OOP: {0}", t_3 - t_2);
Console.WriteLine("Nem OOP static: {0}", t_7 - t_6);
}
static void QuickSort(char[] arr2, int p, int r)
{//quicksort
int Low, High;
char MidValue;
Low = p;
High = r;
MidValue = arr2[(p + r) / 2];
do
{
while (arr2[Low] < MidValue) ++Low;
while (arr2[High] > MidValue) --High;
if (Low <= High)
{
char T = arr2[Low];
arr2[Low] = arr2[High];
arr2[High] = T;
++Low;
--High;
}
} while (Low <= High);
if (p < High) QuickSort(arr2, p, High);
if (Low < r) QuickSort(arr2, Low, r);
}
int findCeilInt(char[] str, char first, int l, int h)
{
int ceilIndex = l;
for (int i = l + 1; i <= h; i++)
if (str[i] > first && str[i] < str[ceilIndex])
ceilIndex = i;
return ceilIndex;
}
void Teszt_qsort(char[] arr)
{
char[] tomb = (char[])arr.Clone();
int size = tomb.Length;
QuickSort(tomb, 0, size - 1);
//Array.Sort(tomb);
bool isFinished = false;
while (!isFinished)
{
int i;
/*for (int k = 0; k < size; ++k) Console.Write("{0} ", tomb[k]);
Console.WriteLine("");*/
for (i = size - 2; i >= 0; --i) if (tomb[i] < tomb[i + 1]) break;
if (i == -1) isFinished = true;
else
{
int ceilIndex = findCeilInt(tomb, tomb[i], i + 1, size - 1);
char temp = tomb[i];
tomb[i] = tomb[ceilIndex];
tomb[ceilIndex] = temp;
QuickSort(tomb, i + 1, size - 1);
//Array.Sort(tomb, i + 1, size - i - 1);
}
}
}
static int stfindCeilInt(char[] str, char first, int l, int h)
{
int ceilIndex = l;
for (int i = l + 1; i <= h; i++)
if (str[i] > first && str[i] < str[ceilIndex])
ceilIndex = i;
return ceilIndex;
}
static void stTeszt_qsort(char[] arr)
{
char[] tomb = (char[])arr.Clone();
int size = tomb.Length;
QuickSort(tomb, 0, size - 1);
//Array.Sort(tomb);
bool isFinished = false;
while (!isFinished)
{
int i;
//for (int m = 0; m < size; ++m) Console.Write("{0} ", tomb[m]);
//Console.WriteLine("");
for (i = size - 2; i >= 0; --i) if (tomb[i] < tomb[i + 1]) break;
if (i == -1) isFinished = true;
else
{
int ceilIndex = stfindCeilInt(tomb, tomb[i], i + 1, size - 1);
char temp = tomb[i];
tomb[i] = tomb[ceilIndex];
tomb[ceilIndex] = temp;
QuickSort(tomb, i + 1, size - 1);
//Array.Sort(tomb, i + 1, size - i - 1);
}
}
}
}
public class Permutator_modositott
{
public char[] State { get; }
int _size;
bool isFinished = false;
public Permutator_modositott(char[] symbols)
{
if (symbols?.Length > 0)
{
_size = symbols.Length;
State = (char[])symbols.Clone();
Array.Sort(State);
}
else
throw new ArgumentException("input must be non-empty");
}
public bool Next()
{
if (isFinished)
return false;
isFinished = !AdvanceState();
return !isFinished;
}
bool AdvanceState()
{
int i, j;
for (i = _size - 2, j = _size - 1; i >= 0; --i, --j)
if (State[i] < State[j])
break;
if (i == -1)
return false;
int ceilIndex = findCeil(State, State[i], i + 1, _size - 1);
char tmp = State[i];
State[i] = State[ceilIndex];
State[ceilIndex] = tmp;
Array.Sort(State, i + 1, _size - i - 1);
return true;
}
int findCeil(char[] str, char first, int l, int h)
{
int ceilIndex = l;
for (int i = l + 1; i <= h; ++i)
if (str[i] > first && str[i] < str[ceilIndex])
ceilIndex = i;
return ceilIndex;
}
}
public class Permutator
{
public char[] State { get; }
int _size;
bool isFinished = false;
public Permutator(char[] symbols)
{
if (symbols?.Length > 0)
{
_size = symbols.Length;
State = (char[])symbols.Clone();
Array.Sort(State);
}
else
throw new ArgumentException("input must be non-empty");
}
public bool Next()
{
if (isFinished)
return false;
isFinished = !AdvanceState();
return !isFinished;
}
bool AdvanceState()
{
int i;
for (i = _size - 2; i >= 0; --i)
if (State[i] < State[i + 1])
break;
if (i == -1)
return false;
int ceilIndex = findCeil(State, State[i], i + 1, _size - 1);
char tmp = State[i];
State[i] = State[ceilIndex];
State[ceilIndex] = tmp;
Array.Sort(State, i + 1, _size - i - 1);
return true;
}
int findCeil(char[] str, char first, int l, int h)
{
int ceilIndex = l;
for (int i = l + 1; i <= h; i++)
if (str[i] > first && str[i] < str[ceilIndex])
ceilIndex = i;
return ceilIndex;
}
}
}Az eredmény:
Eredeti: 46213
Módosított: 45772
Nem OOP: 14693
Nem OOP static: 14295Látszik, hogy a qsort alkalmazásával kb. harmada idő alatt lefutnak.
Érdemes lenne a rendezésre is csinálni teszteket.
De most nincs időm.[ Szerkesztve ]
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
wollnerd
aktív tag
Sziasztok!
Van egy kérdésem, amire magyarázatot szeretnék kapni hogy miért van ez.
Dolgozok egy idáig már 3 winform-os project-en. Amikor a 3. form-on kezdtem el dolgozni, átmenetileg átírtam a Program.cs-ben az Application.Run sorban arra a 3. form-ra hogy rögtön azt lássam.
Ma pedig végletesnek tituláltam a 3. form-ot és leprogramoztam az adatátvitel egy részét a 3. form-ra. Majd visszaírom a Program.cs-ben arra a fő ablakra. (Nos, valójában a főablak az induláskor elrejtve magát, mert behoz egy kisebb ablakot és azt leokézva felfedi magát a főablak a kisablakban megadott adatok átvitelével a főablakba.)
És azt láttam hogy egyszerűen nem akart elindulni a főform! (BlackjackWF) hajamat téptem, hiába tettem breakpoint-okat, de aztán meglepve rájöttem hogy... (kép alább)
És nem értem miért... Új típusú WinForm változó más névvel a welcomeform (a kisablak) alatt és mégis ez a 3. form megakadályozza főablak megjelenését!
Nem értem hogy miért és milyen programnyelvi utasítási szabályok alapján történik az, amit még a Debugger se mond el, sok-sok breakpointtal sem?!
Mindenesetre megnyugodtam, hiszen, ha nincs az a sor, szépen elindul a főablak, de ha aktív e sor, itt, akkor kapufa...Lehet hogy azt a sort jobb abba a button click event blokkjába helyezni, ahol megnyilna a 3. form...
[ Szerkesztve ]
PC: GIGABYTE Z490 GAMING X, Intel i7 1080K 3.8 Ghz (5 Ghz) , 32 GB DDR4 RAM, NVIDIA GeForce RTX3080, Windows 10 Pro 64bit, HP Reverb G2, Be quiet! Pure Base 500DX White ház
-
leslie23
tag
Sziasztok! Loosely coupled példát próbálok összerakni, MVP pattern használatával (WinForms).
Gondban vagyok, hogy jelen scenario esetén pontosan mi lenne nálam a Model. A MainFormon rendeléseket listázok (Order class példányai), egy SubFormon pedig lehetőség lenne a MainFormon kijelölt rendelés(ek) státuszának módosítására. A MainForm implementál egy IView interface-t, amin keresztül a MainFormhoz tartozó presenterrel történik a kommunikáció. Viszont a kérdés, hogy jelen esetben mi lenne a model? Egy repo, amely rendelkezik egy List<Order> mezővel?
Illetve a SubForm esetén ugyanez a kérdés, ha kijelöl 3 rendelést a user, akkor a SubForm modelje egy 3 elemű List<Order> lesz, amit a MainFormról adok át a SubForm megnyitásakor? -
WaterWawe
őstag
Sziasztok!
Linuxos Docker konténerben használnék az alkalmazásommal Onnx modelt. A probléma, hogy ehhez a Nuget "Microsoft.ML.OnnxRuntime" egy natív könyvtárat hív és nem talál össze a megfelelő DLL-el (Vagyis Linuxon .so-val), hiába állítom be ezt külön. A Dockerfile a szükséges apt-get install-t tartalmazza.
A konkrét hibaüzenet:
System.TypeInitializationException: The type initializer for 'Microsoft.ML.OnnxRuntime.NativeMethods' threw an exception.
---> System.DllNotFoundException: Unable to load shared library 'onnxruntime' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: libonnxruntime: cannot open shared object file: No such file or directoryDockerfile parancsok:
...
WORKDIR /src
RUN apt-get update && apt-get install -y libgomp1
RUN export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/app/src/runtimes/linux-x64/native
... -
cigam
félisten
Egy kis logikai bukfencbe gabajodtam. Írtam egy stopper/visszaszámlálót.kb jól működik, de a vezérlése ravasz:
private void keyListening(object sender, KeyEventArgs e)
{
// Ha már fut a visszaszámlálás, nem engedi átváltani előreszámlálásra
if (e.Key == Key.F1 & !stopWatch.IsRunning)
{
reverse = false;
StartStopwatch();
}
if (e.Key == Key.F2) StopStopwatch();
if (e.Key == Key.F3)
{
reverse = false;
DeleteVariables();
}
if (e.Key == Key.F4) { Environment.Exit(0); ; }
// Ha má elindult a stopper, nem engedi átváltani visszaszámlálásra
if (e.Key == Key.F5 & !stopWatch.IsRunning)
{
reverse = true;
StartStopwatch();
}
if (e.Key == Key.F6) StopStopwatch();
if (e.Key == Key.F7)
{
reverse = true;
timeLimit = 10;
DeleteVariables();
}
if (e.Key == Key.F7)
{
reverse = true;
timeLimit = 10;
DeleteVariables();
}
if (e.Key == Key.Up & !stopWatch.IsRunning)
{
timeLimit++;
if (timeLimit > 30) timeLimit = 30;
minuteLabel.Content = timeLimit;
}
if (e.Key == Key.Down & !stopWatch.IsRunning)
{
timeLimit--;
if (timeLimit < 1) timeLimit = 1;
minuteLabel.Content = timeLimit;
}
}
Hogyan mondjam meg neki, hogy akkor se induljon el a stopper (F1), ha a visszaszámláló elérte a 0-át és megállt?
[ Szerkesztve ]
Freeware, és akciós programok egy helyen https://www.facebook.com/freewarenews
-
Atomantiii
őstag
Kérlek ne nevessetek ki, még most ismerkedem a C#-al. Szóval szeretnék csinálni egy menüvel rendelkező programot visual studio 2019-ben, windows forms app-ként (net framework).
Eljutok odáig, hogy csinálok egy menustrip-et, hozzáadom a kívánt menüket, amikben évszámok is vannak. pl 2015, 2016, ... 2021.
De azt akarom elérni, hogy az adott menüben jövőre 1-el nagyobb évszám jelenjen meg. Ezt meg is tudom csinálni azzal, hogy beírom az adott menü elemének, hogy vonja ki az adott évet a mostaniból.
Pl this.toolStripMenuItem7.Text = System.DateTime.Today.AddYears(-1).ToString("yyyy");
De ha átváltok designer nézetből egy másikba, majd vissza designer nézetbe akkor ezt az előző sort átírja 2020-ra és törli azt. Hogyan lehetne elérni azt, hogy ne írja át az adott évre, hanem megmaradjon az hosszú formában?
[ Szerkesztve ]
-
DrojDtroll
addikt
válasz Atomantiii #9478 üzenetére
Nem biztos, hogy értem a problémát.
Csak a designer-ben van gond?
-
cigam
félisten
válasz Atomantiii #9478 üzenetére
Ezt a sort pontosan hova írod be?
Freeware, és akciós programok egy helyen https://www.facebook.com/freewarenews
-
Atomantiii
őstag
válasz DrojDtroll #9479 üzenetére
Akkor nekifutok még egyszer. Van egy windows forms app-om (.net frameworkos)
Szeretnék egy menühöz elemeket hozzáadni, pl most 2021-ben jelenjen meg az adott menüben 2021. Jövőre jelenjen meg ugyanabban a menüpontban 2021 helyett 2022.
Tehát a 0 helyett idén 2021 jelenleg meg, jövőre meg 2022, attól függ melyik évben vagyunk.Ekkor a form1.designer.cs-ben ez jelenik meg:
this.toolStripMenuItem3.Text = "0";
Ha ide beírom, az alábbi sort, akkor megjelenik a 0 helyett 2021 a menüben.
this.toolStripMenuItem3.Text = System.DateTime.Today.AddYears(0).ToString("yyyy");Ha a form1.designer.cs-ről átváltok form1.cs[design]-ra és ott mondjuk adok még hozzá menüket és utána visszaváltok form1.designer.cs-re, hogy az újaknak is megadjam a System.DateTime.Today.AddYears dolgait akkor azt látom, hogy a korábban beírt this.toolStripMenuItem3.Text = System.DateTime.Today.AddYears(0).ToString("yyyy"); helyett visszaírja ezt: this.toolStripMenuItem3.Text = "2021";
Vagy ez van olyan okos, hogy jövőre ide 2022-őt fog írni?
-
martonx
veterán
válasz Atomantiii #9481 üzenetére
Évtizedek óta nem winforms-oztam, de szvsz a *.designer.cs fileokat nem szabadna módosítani. Szóval rosszul álltál neki, rossz helyen módosítasz.
Én kérek elnézést!
-
Keem1
addikt
válasz Atomantiii #9483 üzenetére
Ez esetben nem ártana egy C# alapok könyvet forgatni, ugyanis a *.designer.cs fájlokat az editor módosítja, nyilván a form vizuális módosításakor felülírja amit kézzel bele szerkesztesz.
Ez [link] egy elég jó alapot adó könyv, ha magyarul kellene ajánlani valamit.
Ja, és még egy jó tanács: egy új nyelv elsajátítását nem GUI programmal kezdjük, hanem konzolossal. Ha már mennek az alapok, alap programozási dolgok, objektumok, iterációk, öröklődés, streamek, stb, jöhet a gui
Ez azért is fontos, mivel akkor érsz el jó eredményt, ha tudod, mit csinál a vizuális editor egy gomb felhelyezésekor. Hisz mögötte az is kód. Akkor tanultad meg jól, ha már megy akár notepadból is egy form és a rajta lévő controlok felrakása kódból.[ Szerkesztve ]
-
Keem1
addikt
válasz Atomantiii #9485 üzenetére
Nem fogod megbánni Én még egy korai verzióján tanultam meg a C# alapokat (úgy, hogy már egyéb programnyelvből - delphi, php - voltak alapjaim).
Bár nem vagyok programozó, sőt, de C#-ban egy komplett kis utazási irodai rendszert készítettem úgy 5-6 év alatt, webes szinkronnal, mögöttes MySQL adatbázissal, 3-4 alkalmazott egyidejű használatára. Működött, de azóta lettek jobbak a piacon, különben még ma is működne, és ha én is ott dolgoznékAz jó, ha a konzolos alapok már megvannak, sőt, az is, ha esetleg korábbról más programozási nyelvi alapok is vannak, hisz akkor sokkal könnyebb egy új nyelvet elsajátítani.
Nézd, csak hogy tudd, nem vicceltem
[ Szerkesztve ]
-
Atomantiii
őstag
Jó hát nem fogom elvenni más programozóktól a kenyerüket, de nem is az a cél, hanem valamennyire bele szeretnék tanulni én is meló miatt is, hogy egyszerűbb dolgokkal elboldoguljak én is.
Illetve van egy saját programom is ami nagyon rég készült még visual basic 6-ban (egyébként még ma is működik win 10-en is), de elsődlegesen azt szeretném korszerűsíteni, ezért indultam el a windows forms app irányába. De most már így akkor értem, hogy hova írhatok és hova nem (célszerű).
-
DrojDtroll
addikt
Sziasztok!
Van tool arra, hogy egy adott nagyobb rafaktorálás után kiderítsem, hogy a refaktorálás módosított-e valamit a program logikáján?
Sajnos olyan projektről van szó amihez semmi teszt nincs.[ Szerkesztve ]
-
disy68
aktív tag
válasz DrojDtroll #9488 üzenetére
komponens tesztek, integrációs tesztek, end-to-end tesztek és opcionális manuál tesztelés a scope-tól függően
“Yeah, well, you know, that’s just, like, your opinion, man.” — The Dude
-
nagyúr
válasz DrojDtroll #9488 üzenetére
Igen, úgy hívják a tool-t hogy unit teszt.
Tehát a refaktorálás előtt megírod a unit teszteket ha nincsenek, majd refaktorálsz és ellenőrzöd hogy továbbra is jók-e a tesztek.
-
-
Alexios
veterán
válasz DrojDtroll #9488 üzenetére
Unit/egyéb tesztek ahogy korábban is írták, ajánlott olvasmány: [link]
[ Szerkesztve ]
-
pmonitor
aktív tag
válasz martonx #9482 üzenetére
a *.designer.cs fileokat nem szabadna módosítani.
Dehogynem szabad. Pl. itt a microsoft hivatalos oldalán sincs külön .designer file.
Úgyhogy nyugodtan lehet. Csak tudni kell, hogy mit csinál az ember fia.http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
fatal`
félisten
válasz pmonitor #9495 üzenetére
Kicsit kevered a dolgokat. Itt azért nincs külön designer fájl, mert kódból pakolja fel a controlokat a formra (nem is látszódnának a designerben VS alatt).
Designer által létrehozott fájlokat nem piszkálunk, mert felül fog íródni (vagy épp elszáll a designer ha hülyeséget írnak bele). Persze át lehet írni őket, csak nagyon figyelni kell (viszont a példád nem állja meg a helyét).
-
pmonitor
aktív tag
válasz pmonitor #9497 üzenetére
Talán 4 perc is volt... Ezért írtam, hogy tudni kell, hogy mit csinál az ember fia/lánya.
using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Security.Permissions;
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
public class Form1 : Form
{
private IContainer components;
private WebBrowser webBrowser1;
private MenuStrip menuStrip1;
private ToolStripMenuItem fileToolStripMenuItem,
saveAsToolStripMenuItem, printToolStripMenuItem,
printPreviewToolStripMenuItem, exitToolStripMenuItem,
pageSetupToolStripMenuItem, propertiesToolStripMenuItem;
private ToolStripSeparator toolStripSeparator1, toolStripSeparator2;
private ToolStrip toolStrip1, toolStrip2;
private ToolStripTextBox toolStripTextBox1;
private ToolStripButton goButton, backButton,
forwardButton, stopButton, refreshButton,
homeButton, searchButton, printButton;
private StatusStrip statusStrip1;
private ToolStripStatusLabel toolStripStatusLabel1;
public Form1()
{
// Create the form layout. If you are using Visual Studio,
// you can replace this code with code generated by the designer.
InitializeComponent();
// The following events are not visible in the designer, so
// you must associate them with their event-handlers in code.
webBrowser1.CanGoBackChanged +=
new EventHandler(webBrowser1_CanGoBackChanged);
webBrowser1.CanGoForwardChanged +=
new EventHandler(webBrowser1_CanGoForwardChanged);
webBrowser1.DocumentTitleChanged +=
new EventHandler(webBrowser1_DocumentTitleChanged);
webBrowser1.StatusTextChanged +=
new EventHandler(webBrowser1_StatusTextChanged);
// Load the user's home page.
webBrowser1.GoHome();
}
// Displays the Save dialog box.
private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
{
webBrowser1.ShowSaveAsDialog();
}
// Displays the Page Setup dialog box.
private void pageSetupToolStripMenuItem_Click(object sender, EventArgs e)
{
webBrowser1.ShowPageSetupDialog();
}
// Displays the Print dialog box.
private void printToolStripMenuItem_Click(object sender, EventArgs e)
{
webBrowser1.ShowPrintDialog();
}
// Displays the Print Preview dialog box.
private void printPreviewToolStripMenuItem_Click(
object sender, EventArgs e)
{
webBrowser1.ShowPrintPreviewDialog();
}
// Displays the Properties dialog box.
private void propertiesToolStripMenuItem_Click(
object sender, EventArgs e)
{
webBrowser1.ShowPropertiesDialog();
}
// Selects all the text in the text box when the user clicks it.
private void toolStripTextBox1_Click(object sender, EventArgs e)
{
toolStripTextBox1.SelectAll();
}
// Navigates to the URL in the address box when
// the ENTER key is pressed while the ToolStripTextBox has focus.
private void toolStripTextBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
Navigate(toolStripTextBox1.Text);
}
}
// Navigates to the URL in the address box when
// the Go button is clicked.
private void goButton_Click(object sender, EventArgs e)
{
Navigate(toolStripTextBox1.Text);
}
// Navigates to the given URL if it is valid.
private void Navigate(String address)
{
if (String.IsNullOrEmpty(address)) return;
if (address.Equals("about:blank")) return;
if (!address.StartsWith("http://") &&
!address.StartsWith("https://"))
{
address = "http://" + address;
}
try
{
webBrowser1.Navigate(new Uri(address));
}
catch (System.UriFormatException)
{
return;
}
}
// Updates the URL in TextBoxAddress upon navigation.
private void webBrowser1_Navigated(object sender,
WebBrowserNavigatedEventArgs e)
{
toolStripTextBox1.Text = webBrowser1.Url.ToString();
}
// Navigates webBrowser1 to the previous page in the history.
private void backButton_Click(object sender, EventArgs e)
{
webBrowser1.GoBack();
}
// Disables the Back button at the beginning of the navigation history.
private void webBrowser1_CanGoBackChanged(object sender, EventArgs e)
{
backButton.Enabled = webBrowser1.CanGoBack;
}
// Navigates webBrowser1 to the next page in history.
private void forwardButton_Click(object sender, EventArgs e)
{
webBrowser1.GoForward();
}
// Disables the Forward button at the end of navigation history.
private void webBrowser1_CanGoForwardChanged(object sender, EventArgs e)
{
forwardButton.Enabled = webBrowser1.CanGoForward;
}
// Halts the current navigation and any sounds or animations on
// the page.
private void stopButton_Click(object sender, EventArgs e)
{
webBrowser1.Stop();
}
// Reloads the current page.
private void refreshButton_Click(object sender, EventArgs e)
{
// Skip refresh if about:blank is loaded to avoid removing
// content specified by the DocumentText property.
if (!webBrowser1.Url.Equals("about:blank"))
{
webBrowser1.Refresh();
}
}
// Navigates webBrowser1 to the home page of the current user.
private void homeButton_Click(object sender, EventArgs e)
{
webBrowser1.GoHome();
}
// Navigates webBrowser1 to the search page of the current user.
private void searchButton_Click(object sender, EventArgs e)
{
webBrowser1.GoSearch();
}
// Prints the current document using the current print settings.
private void printButton_Click(object sender, EventArgs e)
{
webBrowser1.Print();
}
// Updates the status bar with the current browser status text.
private void webBrowser1_StatusTextChanged(object sender, EventArgs e)
{
toolStripStatusLabel1.Text = webBrowser1.StatusText;
}
// Updates the title bar with the current document title.
private void webBrowser1_DocumentTitleChanged(object sender, EventArgs e)
{
this.Text = webBrowser1.DocumentTitle;
}
// Exits the application.
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void InitializeComponent()
{
this.components = new Container();
this.webBrowser1 = new System.Windows.Forms.WebBrowser();
this.menuStrip1 = new System.Windows.Forms.MenuStrip();
this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.pageSetupToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.printToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.printPreviewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.propertiesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.goButton = new System.Windows.Forms.ToolStripButton();
this.backButton = new System.Windows.Forms.ToolStripButton();
this.forwardButton = new System.Windows.Forms.ToolStripButton();
this.stopButton = new System.Windows.Forms.ToolStripButton();
this.refreshButton = new System.Windows.Forms.ToolStripButton();
this.homeButton = new System.Windows.Forms.ToolStripButton();
this.searchButton = new System.Windows.Forms.ToolStripButton();
this.printButton = new System.Windows.Forms.ToolStripButton();
this.toolStrip2 = new System.Windows.Forms.ToolStrip();
this.toolStripTextBox1 = new System.Windows.Forms.ToolStripTextBox();
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel();
this.menuStrip1.SuspendLayout();
this.toolStrip1.SuspendLayout();
this.toolStrip2.SuspendLayout();
this.statusStrip1.SuspendLayout();
this.SuspendLayout();
//
// webBrowser1
//
this.webBrowser1.Dock = System.Windows.Forms.DockStyle.Fill;
this.webBrowser1.Location = new System.Drawing.Point(0, 74);
this.webBrowser1.Name = "webBrowser1";
this.webBrowser1.Size = new System.Drawing.Size(704, 304);
this.webBrowser1.TabIndex = 0;
this.webBrowser1.Navigated += new System.Windows.Forms.WebBrowserNavigatedEventHandler(this.webBrowser1_Navigated);
//
// menuStrip1
//
this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.fileToolStripMenuItem});
this.menuStrip1.Location = new System.Drawing.Point(0, 0);
this.menuStrip1.Name = "menuStrip1";
this.menuStrip1.Size = new System.Drawing.Size(704, 24);
this.menuStrip1.TabIndex = 3;
//
// fileToolStripMenuItem
//
this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.saveAsToolStripMenuItem,
this.toolStripSeparator1,
this.pageSetupToolStripMenuItem,
this.printToolStripMenuItem,
this.printPreviewToolStripMenuItem,
this.toolStripSeparator2,
this.propertiesToolStripMenuItem,
this.exitToolStripMenuItem});
this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
this.fileToolStripMenuItem.Text = "&File";
//
// saveAsToolStripMenuItem
//
this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem";
this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.saveAsToolStripMenuItem.Text = "Save &As...";
this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click);
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(149, 6);
//
// pageSetupToolStripMenuItem
//
this.pageSetupToolStripMenuItem.Name = "pageSetupToolStripMenuItem";
this.pageSetupToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.pageSetupToolStripMenuItem.Text = "Page Set&up...";
this.pageSetupToolStripMenuItem.Click += new System.EventHandler(this.pageSetupToolStripMenuItem_Click);
//
// printToolStripMenuItem
//
this.printToolStripMenuItem.Name = "printToolStripMenuItem";
this.printToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.P)));
this.printToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.printToolStripMenuItem.Text = "&Print...";
this.printToolStripMenuItem.Click += new System.EventHandler(this.printToolStripMenuItem_Click);
//
// printPreviewToolStripMenuItem
//
this.printPreviewToolStripMenuItem.Name = "printPreviewToolStripMenuItem";
this.printPreviewToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.printPreviewToolStripMenuItem.Text = "Print Pre&view...";
this.printPreviewToolStripMenuItem.Click += new System.EventHandler(this.printPreviewToolStripMenuItem_Click);
//
// toolStripSeparator2
//
this.toolStripSeparator2.Name = "toolStripSeparator2";
this.toolStripSeparator2.Size = new System.Drawing.Size(149, 6);
//
// propertiesToolStripMenuItem
//
this.propertiesToolStripMenuItem.Name = "propertiesToolStripMenuItem";
this.propertiesToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.propertiesToolStripMenuItem.Text = "Properties";
this.propertiesToolStripMenuItem.Click += new System.EventHandler(this.propertiesToolStripMenuItem_Click);
//
// exitToolStripMenuItem
//
this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
this.exitToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.exitToolStripMenuItem.Text = "E&xit";
this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
//
// toolStrip1
//
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.goButton,
this.backButton,
this.forwardButton,
this.stopButton,
this.refreshButton,
this.homeButton,
this.searchButton,
this.printButton});
this.toolStrip1.Location = new System.Drawing.Point(0, 24);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Size = new System.Drawing.Size(704, 25);
this.toolStrip1.TabIndex = 2;
//
// goButton
//
this.goButton.Name = "goButton";
this.goButton.Size = new System.Drawing.Size(26, 22);
this.goButton.Text = "Go";
this.goButton.Click += new System.EventHandler(this.goButton_Click);
//
// backButton
//
this.backButton.Enabled = false;
this.backButton.Name = "backButton";
this.backButton.Size = new System.Drawing.Size(36, 22);
this.backButton.Text = "Back";
this.backButton.Click += new System.EventHandler(this.backButton_Click);
//
// forwardButton
//
this.forwardButton.Enabled = false;
this.forwardButton.Name = "forwardButton";
this.forwardButton.Size = new System.Drawing.Size(54, 22);
this.forwardButton.Text = "Forward";
this.forwardButton.Click += new System.EventHandler(this.forwardButton_Click);
//
// stopButton
//
this.stopButton.Name = "stopButton";
this.stopButton.Size = new System.Drawing.Size(35, 22);
this.stopButton.Text = "Stop";
this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
//
// refreshButton
//
this.refreshButton.Name = "refreshButton";
this.refreshButton.Size = new System.Drawing.Size(50, 22);
this.refreshButton.Text = "Refresh";
this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
//
// homeButton
//
this.homeButton.Name = "homeButton";
this.homeButton.Size = new System.Drawing.Size(44, 22);
this.homeButton.Text = "Home";
this.homeButton.Click += new System.EventHandler(this.homeButton_Click);
//
// searchButton
//
this.searchButton.Name = "searchButton";
this.searchButton.Size = new System.Drawing.Size(46, 22);
this.searchButton.Text = "Search";
this.searchButton.Click += new System.EventHandler(this.searchButton_Click);
//
// printButton
//
this.printButton.Name = "printButton";
this.printButton.Size = new System.Drawing.Size(36, 22);
this.printButton.Text = "Print";
this.printButton.Click += new System.EventHandler(this.printButton_Click);
//
// toolStrip2
//
this.toolStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripTextBox1});
this.toolStrip2.Location = new System.Drawing.Point(0, 49);
this.toolStrip2.Name = "toolStrip2";
this.toolStrip2.Size = new System.Drawing.Size(704, 25);
this.toolStrip2.TabIndex = 1;
//
// toolStripTextBox1
//
this.toolStripTextBox1.Font = new System.Drawing.Font("Segoe UI", 9F);
this.toolStripTextBox1.Name = "toolStripTextBox1";
this.toolStripTextBox1.Size = new System.Drawing.Size(250, 25);
this.toolStripTextBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.toolStripTextBox1_KeyDown);
this.toolStripTextBox1.Click += new System.EventHandler(this.toolStripTextBox1_Click);
//
// statusStrip1
//
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripStatusLabel1});
this.statusStrip1.Location = new System.Drawing.Point(0, 378);
this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Size = new System.Drawing.Size(704, 22);
this.statusStrip1.TabIndex = 4;
//
// toolStripStatusLabel1
//
this.toolStripStatusLabel1.Name = "toolStripStatusLabel1";
this.toolStripStatusLabel1.Size = new System.Drawing.Size(0, 17);
//
// Form1
//
this.ClientSize = new System.Drawing.Size(704, 400);
this.Controls.Add(this.webBrowser1);
this.Controls.Add(this.toolStrip2);
this.Controls.Add(this.toolStrip1);
this.Controls.Add(this.statusStrip1);
this.Controls.Add(this.menuStrip1);
this.Name = "Form1";
this.menuStrip1.ResumeLayout(false);
this.menuStrip1.PerformLayout();
this.toolStrip1.ResumeLayout(false);
this.toolStrip1.PerformLayout();
this.toolStrip2.ResumeLayout(false);
this.toolStrip2.PerformLayout();
this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
protected override void Dispose(bool disposing)
{
if (disposing) { if (components != null) { components.Dispose(); } }
base.Dispose(disposing);
}
}[ Szerkesztve ]
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
Te nem érted. Designer file-ra nincs is szükség. Ha akarod, akkor van, ha nem, akkor nincs.
Ezért írtam, hogy tudni kell, hogy mit csinál az ember fia/lánya.amikor legközelebb megnyitod a formot felül fogja írni.
Csak a megnyitásnál nem írja felül, csak ha módosítod is Designer nézetben. De akkor ugyebár direkt csináltad..
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
Új hozzászólás Aktív témák
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Politika
- Kompakt vízhűtés
- Vodafone otthoni szolgáltatások (TV, internet, telefon)
- Intel Core i5 / i7 / i9 "Alder Lake-Raptor Lake/Refresh" (LGA1700)
- Crypto Trade
- Százmillió Samsung telepítheti a One UI 6.1-et és a Galaxy AI-t
- Kerékpárosok, bringások ide!
- PlayStation 5
- Folyószámla, bankszámla, bankváltás, külföldi kártyahasználat
- Rezsicsökkentés, spórolás (fűtés, szigetelés, stb.)
- További aktív témák...
- G.Skill 48 GB DDR5-7200 (2x 24 GB) 8400 + Alphacool ddr5 ram modul
- Macbook Pro 16" 2019 i9-9980H 64GB 1024GB AMD Radeon Graphics 5500M 8GB 3K Retina
- Asus G15 Zephyrus RTX 3070 15,6 4k 165HZ Ryzen9-5900HS 16gb ram 1TB ssd win11
- Újszerű iPad Air 3 2019 64GB Space Gray Cellular US-5016
- Dell XPS Precision 5530 i7-8850H 4.3GHz 16GB 512GB Nvidia Quadro P2000 (1650Ti) 4K IPS TouchScreen!