Keresés

Részletes keresés

Törölt nick Creative Commons License 2019.05.18 0 0 1105

Írtatok már olyan programot, ami .doc vagy .xls fájlba tud írni?

NevemTeve Creative Commons License 2018.12.31 -1 0 1104

Biztos, hogy jó ötlet egy Windows-specifikus terméket erőltetni Linuxon?

Előzmény: Ren ault Artois (1103)
Ren ault Artois Creative Commons License 2018.12.31 0 0 1103

Látom nem nagyon pörög a topik. De azért lenne egy kérdésem, C#-hoz melyik a legalkalmasabb fordítóprogram Linuxra ? Jelenleg a Visual Studio Code-t használom, de nem vagyok elájulva tőle. Természetesen a szükséges bővítményeket felinstalláltam.

Törölt nick Creative Commons License 2017.10.31 0 0 1102

Igen.

Előzmény: egy hazafi (1101)
egy hazafi Creative Commons License 2017.10.30 0 0 1101

Köszönöm a választ; kipróbálom. Tehát a billentyűnyomást inkább a mainform-ban kezeljem, mint saját class-ban?

Előzmény: Törölt nick (1100)
Törölt nick Creative Commons License 2017.10.30 0 0 1100

Mert Invalidate() -et a Form osztályból örökli a MainForm osztályod. Lehet az, hogy a playernek átadod a Form-ot konstruktor időben, és eltárolod benne, majd azon hívod az invalidate-et, de inkább a MainForm-ban tárold el a playert fieldként, és ott döntsd el, hogy mikor kell invalidate-et hívni, mondjuk úgy, hogy a player booleant ad vissza a függvényeknél, ha frissíteni kell, akkor true-t. 

Előzmény: egy hazafi (1099)
egy hazafi Creative Commons License 2017.10.30 0 0 1099

És abban tudnátok segíteni-elmagyarázni, hogy az Invalidate függvény hívása miért nem működik egy saját, létrehozott Class-on belül? Most már létre tudom hozni objektumként a játékosnégyzetet, ki is tudom így rajzoltatni az osztályból, abban van az elmozdulás ellenőrzése is, de az Invalidate-et nem tudom benne használni, így az elmozdulás nem látszik.

Így néz ki a mainform-om:

 

using System; 
using System.Drawing; 
using System.Collections.Generic; 
using System.Windows.Forms; 

namespace teglalap 

    public partial class MainForm : Form 
    { 
       

       public MainForm() 
        { 
            InitializeComponent(); 
            player p1=new player(50,50);
            Paint += new PaintEventHandler(p1.rajzol); 
            KeyUp += new KeyEventHandler(p1.gombFel);
            KeyDown += new KeyEventHandler(p1.gombLe);
        }
        void MainFormLoad(object sender, EventArgs e)
        {
    
        }

    }

}

 

így pedig a class1 forráskódja:

 

using System;
using System.Drawing;
using System.Collections.Generic;
using System.Windows.Forms; 

namespace teglalap
{
    /// <summary>
    /// Description of Class1.
    /// </summary>
    public class player
    {
        protected int x=50;
        protected int y=50;
        protected Boolean jobbranyil=false;
        protected Boolean balranyil=false;
        protected Boolean felnyil=false;
        protected Boolean lenyil=false;
        
        public player()
        {
        }
        
        public player(int x, int y){
            this.x=x;
            this.x=y;
        }
        
        public void setHelyx(int x){
            this.x=x;
        }
        
        public int getHelyx(){
            return x;
        }
        
        public void setHelyy(int y){
            this.y=y;
        }
        
        public int getHelyy(){
            return y;
        }
        
        public void rajzol(object sender, System.Windows.Forms.PaintEventArgs e){
            SolidBrush blueBrush = new SolidBrush(Color.Blue);
            e.Graphics.FillRectangle(blueBrush,x,y,50,50);
            
            
        }
        
        public void gombLe(object sender, System.Windows.Forms.KeyEventArgs e){
            if (e.KeyCode==Keys.Left
            { 
                balranyil=true;
            } 
            if (e.KeyCode==Keys.Right
            { 
                jobbranyil=true
            } 
            if (e.KeyCode==Keys.Up
            { 
                felnyil=true
            } 
            if (e.KeyCode==Keys.Down
            { 
                lenyil=true
            }
            
            mozg(sender, e);
        }
        
        public void gombFel(object sender, System.Windows.Forms.KeyEventArgs e){
            
            if (e.KeyCode==Keys.Left
            { 
                balranyil=false;
                
            } 
            if (e.KeyCode==Keys.Right
            { 
                jobbranyil=false
            } 
            if (e.KeyCode==Keys.Up
            { 
                felnyil=false
            } 
            if (e.KeyCode==Keys.Down
            { 
                lenyil=false
            } 
            mozg(sender, e);
        }
        
        public void mozg(object sender, System.Windows.Forms.KeyEventArgs e){

            if (jobbranyil==true
            { 
                x=x+5;
            } 
            if (balranyil==true
            { 
                x=x-5;
            } 
            if (felnyil==true
            { 
                y=y-5;
            } 
            if (lenyil==true
            { 
                y=y+5;
            }
             Invalidate(); //De valamiért nem jó!!!
        }
    }
}

ZaphodBeeblebrox Creative Commons License 2017.10.26 0 0 1098

"vár egy kicsit és bejön a hiba (illetve bejött, de már megoldódott)." => erről ez jutott eszembe:

 

https://www.youtube.com/watch?v=E9wS7MMP4YQ

 

;)

Előzmény: egy hazafi (1097)
egy hazafi Creative Commons License 2017.10.24 0 0 1097

Nem, lenyomom a gombot, vár egy kicsit és bejön a hiba (illetve bejött, de már megoldódott).

Előzmény: NevemTeve (1096)
NevemTeve Creative Commons License 2017.10.24 0 0 1096

Nem-e lehet-e, hogy az első gombnyomásra jól lefut, és aztán mégegyszer lenyomtad a gombot?

 

Mert akkor már nem 10-elemű a tömb/lista. Influental Device kolléga mondta a jót:

 

                for (int i=jatekosok.Count-1; i>=0; i--) {
                    if (jatekosok[i].xhely>=100) {
                        jatekosok.RemoveAt(i);
                        Invalidate();
                    }
                }

Előzmény: egy hazafi (1086)
Törölt nick Creative Commons License 2017.10.24 0 0 1095

A ritka hiba épp elég. Ha eggyel mindig növeled az i-t, és ha törlöd az i-ik elemet, akkor az i-nél nagyobb indexű elemek indexe egyel csökken, így törléskor olyan, mintha kettővel növelnéd az i-t, így átugorsz egy elemet, amit lehet, hogy törölni kellene.

Előzmény: egy hazafi (1094)
egy hazafi Creative Commons License 2017.10.24 0 0 1094

Az tényleg jó a using System.Linq; beszúrásával. Köszönöm szépen! :-)

Az előzővel mi volt a gond? Látszólag szépen működött az is (a ritka hibát leszámítva).

Előzmény: Törölt nick (1092)
Törölt nick Creative Commons License 2017.10.24 0 0 1093

Tedd az elejére a:

 

using System.Linq;  -t

Előzmény: egy hazafi (1091)
Törölt nick Creative Commons License 2017.10.24 0 0 1092

Sajna az 1088-as hibás, az 1089-est nézd.

Előzmény: egy hazafi (1090)
egy hazafi Creative Commons License 2017.10.24 0 0 1091

Az nem jó, mert ezt a hibát kapom:

"„System.Collections.Generic.List<valami.jatekos>” nem tartalmazza a(z) „Where” metódus definícióját, és nem található olyan „Where” kiterjesztésmetódus, amely „System.Collections.Generic.List<valami.jatekos>” típusú első argumentumot fogad el (esetleg hiányzik egy „using” direktíva vagy egy szerelvényre mutató hivatkozás). (CS1061) "

Előzmény: Törölt nick (1089)
egy hazafi Creative Commons License 2017.10.24 0 0 1090

Igen, ez lett a megoldás; köszönöm szépen!

Ezzel viszont felbukkant egy érdekes hiba is: amikor a ciklusfej módosítása után futtatom a programot, kinn hagy egy, a feltételnek amúgy megfelelő (xhely>=100) négyzetet a képernyőn és ezt csak az Enter ismételt megnyomásával lehet eltüntetni. Ha ezek után módosítás nélkül többször futtatom a programot, ez a hiba nem jelentkezik (SharpDevelop-ot használok egyébként). :-/

Előzmény: Törölt nick (1088)
Törölt nick Creative Commons License 2017.10.24 0 0 1089

inkább valami ilyesmi kellene:

 

foreach(var item in jatekosok.Where(p=>p.xhely >= 100).ToArray()) {jatekosok.Remove(item);}

Előzmény: egy hazafi (1084)
Törölt nick Creative Commons License 2017.10.24 0 0 1088

for (int i=0;i<=9;i++)

 

helyett:

 

for (int i=0;i<jatekosok.Count;i++)

Előzmény: egy hazafi (1084)
pimre Creative Commons License 2017.10.24 0 0 1087

Biztos, hogy a for ciklusban az i>=0 kell? Nem lenne elég csak i>0?

Előzmény: NevemTeve (1085)
egy hazafi Creative Commons License 2017.10.24 0 0 1086

Kipróbáltam, de ugyanazt a hibát okozza. Lehet, hogy a ciklusváltozót kéne birizgálni a ciklusmagon belül?

Előzmény: NevemTeve (1085)
NevemTeve Creative Commons License 2017.10.23 0 0 1085

Amikor törölsz egyet, akkor már kevesebb, mint 10 eleme van a listának. Mondjuk csináld fordítva:

 

                for (int i=9; i>=0; i--) {
                    if (jatekosok[i].xhely>=100) {
                        jatekosok.RemoveAt(i);
                        Invalidate();
                    }
                }

Előzmény: egy hazafi (1084)
egy hazafi Creative Commons License 2017.10.23 0 0 1084

Sziasztok!

A következő probléma megoldásához keresek segítséget: kirajzolok 10 db négyzetet véletlen helyekre a programablakban, ezek a jatekos-ok. Enter lenyomására szeretném törölni ezek közül azokat, amelyek X koordinátája >= 100. Ezt a gombnyomas() függvény intézné, viszont amikor ez bekövetkezik, a következő hibaüzenetet kapom:

"System.ArgumentOutOfRangeException: Az index az engedélyezett tartományon kívül esett. Az index nem lehet negatív, és kisebbnek kell lennie a gyűjtemény méreténél."

Viszont amikor átírom a gombnyomas()-ban a for ciklus értékét 9 helyett 5-re, nem jelentkezik ez a hiba - viszont nyilván nem fut le az összes négyzeten a ciklus:

for (int i=0;i<=5;i++) ...

Mi lehet a baj és mi a megoldása?

Íme a teljes kód:

 

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace valami
{
    public class jatekos
    {
            public int xhely;
            public int yhely;
            public int szel;
            public int mag;
            public jatekos()
            {
                szel=50;
                mag=50;
            }
    }
    
    public partial class MainForm : Form
    {
        List<jatekos> jatekosok=new List<jatekos>();
        
        public MainForm()
        {
            InitializeComponent();
            Random vsz=new Random();
            for (int i=0;i<=9;i++)
            {
                jatekosok.Add(new jatekos() {xhely=vsz.Next(1,200),yhely=vsz.Next(1,200)});
            }
            Paint += new PaintEventHandler(Rajzol); 
            KeyDown += new KeyEventHandler(gombnyomas);
        }
        
        void Rajzol(object sender, PaintEventArgs e) 
        { 
            foreach (jatekos ujjatekos in jatekosok)
            {
                e.Graphics.FillRectangle(Brushes.BlueViolet,new Rectangle(ujjatekos.xhely,ujjatekos.yhely,ujjatekos.szel,ujjatekos.mag));
            }
        }
            
        void gombnyomas(object sender, KeyEventArgs e) 
        { 
            if (e.KeyCode==Keys.Enter
            { 
                for (int i=0;i<=9;i++) //Itt írom át a 9-et 5-re!
                {
                    if (jatekosok[i].xhely>=100)
                    {
                        jatekosok.RemoveAt(i);
                        Invalidate();
                    }
                }
            
            }
        }
    }
    
}

Pool# Creative Commons License 2017.06.15 0 0 1083

Köszönöm a segítségeket és a linket!

Előzmény: Törölt nick (1082)
Törölt nick Creative Commons License 2017.06.14 0 1 1082

A GetPixel-SetPixel lassú, hanyagolnám. A tömbös megoldás már jobb, de ha jól emlékszem, a GDI+ .NET api hozzáférést engedélyez a bitsíkokhoz is, tömbként látod a képet másolgatás nélkül. Érdemes valami olyan belső reprezentációt (ahogyan a Bitmap magában tárolja a kép adatait) választani, amit könnyen lehet manipulálni tömb hozzáféréssel.

 

Garanciát nem vállalok, nem próbáltam, de rémlik, hogy ez az elv működhet.

 

Pl: https://stackoverflow.com/questions/1563038/fast-work-with-bitmaps-in-c-sharp

Előzmény: Pool# (1080)
_szergej_ Creative Commons License 2017.06.13 0 1 1081

A "lassan fut le" szerintem elegge relativ, jollehet a sebesseg fugghet a kep pixeleinek szamatol (+ ertelemszeruen az algoritmustol is). Szvsz hasonlitsd ossze egy masik program (pl. Gimp) milyen gyorsan hajt vegre egy hasonlo kaliberu algoritmust ugyanazon a kepen (nyilvanvaloan nem jo pelda a Gimp a nem C# alapu kodok es "agyonoptimalizalt" third-party libeknek koszonhetoen, de osszehasonlitasi alapnak talan jo, vagy nezz masik kepfeldolgozo progit)

Nem probaltam ki, de a GetPixel()-SetPixel() kombonak nagyobb az overheadje, mintha siman tombadatokon/pointerekkel operalnal.

Előzmény: Pool# (1080)
Pool# Creative Commons License 2017.06.13 0 0 1080

Sziasztok!

 

Lenne egy kérdésem a C# futássebességével kapcsolatban. Írtam egy kis képfeldolgozó programot és egy kicsit lassan fut le, i7-es processzoros gépen akár 10-15 másodperc.

 

 

Melyik gyorsabb?


1. Ha a kép pixel adatait beolvasáskor egy tömbbe teszem, majd a képfeldolgozás során a FOR ciklusban számoláskor a tömbből hívom elé az értéket és végzek vele műveleteket, végül pedig egy másik tömbbe beírom az eredményt.

2. Vagy ha nem használok tömböket, hanem képfeldolgozás rész FOR ciklusában olvasom ki egyenként a kép pixeleit a "GetPixel" utasítással majd írom egy másik fájlba egyenként "SetPixel" utasítással?

 

 

Esetleg ha a fenti két megoldás egyike sem gyors, akkor hogy kéne ezt megoldani. Vázlatszerűen valaki el tudná mondani?

NevemTeve Creative Commons License 2017.05.23 0 0 1079

Spoiler:

00-02: #1 és #2 --> oda

02-03: #1 <-- vissza

03-13: #5 és #10 --> oda

13-15: #2 <-- vissza

15-17: #1 és #2 -->

 

vagy:

00-02: #1 és #2 --> oda

02-04: #2 <-- vissza

04-14: #5 és #10 --> oda

14-15: #1 <-- vissza

15-17: #1 és #2 -->

 

Előzmény: fregma (1078)
fregma Creative Commons License 2017.05.23 0 0 1078

Valaki eltudná küldeni nekem ennek a feladatnak a megoldását mert nem tudom megcsinálni és szükségem lenne rá hogy megértsem a működési elvét az ilyen programoknak előre is nagyon köszönöm ha valaki szán rám időt .


Négy ember át akar jutni egy híd egyik oldaláról a másikra. A hídon egyszerre
legfeljebb két ember mehet át. Az első embernek egymagában 1 perc, a
másodiknak 2 perc, a harmadiknak 5 perc, a negyedik pedig 10 perc szükséges
a hídon való átkeléshez. Ha ketten mennek egyszerre, akkor mindketten a
lassabban haladó tempójában ballagnak. Az átkeléshez adott és szükséges
tovább´a egy elemlámpa, amelyet magunkkal visznek az átkelők. (L´ampa
nélkül nem lehet átmenni.) Hogyan jutnak át mind a négyen a túlsó oldalra
17 percen belül?

Pool# Creative Commons License 2017.05.21 0 0 1077

A "Save as" funkciót ismerem, de a VisualStudio c# ban a mentés teljesen eltér a megszokottól. Más programban ha elmentek egy fájlt, akkor utána a régi és az új fájl is meglesz más más névvel. A C# ban ha létrehozok egy projektet és elmentem, akkor eleve nem egy fájl képződik, hanem számtalan könyvtár és fájl. Ha pedig utána egy "save as" mentést csinálok, akkor pedig néhány fájl új névvel mentésre kerül, néhány pedig nem. Zavaros az egész, ennek a részét valahogy átláthatóbbra megcsinálhatták volna. Egyáltalán nem olyan mint mondjuk egy wordben elmentek valamit másként. Sajnos ezt az alap dolgot nem is nagyon részletezik könyvekben. Persze tudom a googlen mindent meg lehet találni.

Előzmény: NevemTeve (1076)
NevemTeve Creative Commons License 2017.05.21 0 0 1076

Először egy egyszerűbb programban, mondjuk a Notepad-ban kellene megismerkedni a 'Save As' avagy 'Mentés Másként' funkcióval.

Előzmény: Pool# (1075)

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!