Kezdőoldal » Számítástechnika » Programozás » Karakterek beszúrása probléma...

Karakterek beszúrása probléma delphiben, van rá megoldás?

Figyelt kérdés

A segítségeteket szeretném kérni,mert elakadtam benne. Olyan progit kell írnom,ami két db számérték beírásakor, azaz 122 esetén egy "-" jelet ír a textboxba egy enter lenyomása után, 123 esetén pedig "+" jelet és ezt ismételgeti így a végtelenségbe, ebben a formában pl:


122-123+122-123+122-123+122-123+ stb...

vagy

123+122-123+122-123+122-123+122-123+ stb...


3 számjegyig sikerült megoldanom,de aztán sajnos rendesen elakadtam és bele is fáradtam sajnos.Azt feltételezem,hogy biztos nem lehet azért ördöngösség megoldani,de jelenleg fogalmam nincs miképpen lehetséges és mit hagytam figyelmen kívül.Az én megoldásom biztosan pocsék, ezért szeretném kérni hogy segítsetek benne,mert elfogyott a türelmem vele szórakozni.:))


Előre is köszi!


Az eddigi próbálkozásom:


unit karakterbeszur;


interface


uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;


type

TForm1 = class(TForm)

Edit1: TEdit;

procedure Edit1KeyPress(Sender: TObject; var Key: Char);

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;


var

Form1: TForm1;

var s:string;

implementation


{$R *.dfm}


function RepeatString(const s: string; count: cardinal): string;

var i:integer;

begin

for i := 1 to count do

Result := Result + s;

end;


procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

var x:integer;

var y:integer;

begin

if key=#13 then begin


x:=length(edit1.text)+2;

y:=length(edit1.text)-2;


{x:=edit1.SelStart+2;

y:=edit1.selstart-2;}


if pos('123',edit1.text)>0 then begin

edit1.selText:=repeatstring('+',1);

s:=edit1.text;

delete(s,x+y,1);

edit1.Text:=s;

edit1.SelStart:=x-y div 4;

end;


if pos('122',edit1.text)>0 then begin

edit1.selText:=repeatstring('-',1);

s:=edit1.text;

delete(s,x-1,1);

edit1.Text:=s;

edit1.SelStart:=y+x * 4;

end;


end;

end;



2015. szept. 30. 15:32
 71/95 SimkoL ***** válasza:

Bocs, - erős a törköly felénk - egy ciklus:


procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);

var honnan, i: integer;

seged, kell : string;

begin

if Key = 13 then

begin

seged := Edit1.Text;

Edit1.Text := '';

honnan := 1;

while honnan - 3 < Length(seged) do

begin

kell := '';

kell := Copy(seged, honnan, 3);

if (kell = '122') or (kell = '123') then

begin

honnan := honnan + 2;

if kell = '122' then Edit1.Text := Edit1.Text + kell + '-' else Edit1.Text := Edit1.Text + kell + '+';

end;

Inc(honnan);

end;

Edit1.SelStart := Length(Edit1.Text);

end;

end;

2015. okt. 2. 19:27
Hasznos számodra ez a válasz?
 72/95 SimkoL ***** válasza:
Egy 'segéd' változóval kicsit átláthatóbb a program, nem kell az eredeti stringbe benyúlni, figyelni a méretét.
2015. okt. 2. 19:33
Hasznos számodra ez a válasz?
 73/95 coopper ***** válasza:

Szia #67-es hozzászóló :


A foráskódból kisebb átalakitással meg lehet valósitani azt, hogy 123 alatti illetve felett számokra irja a jeleket, azt hogy kalkulátor legyen belőle, ahhoz viszont már egy nagyobb lélegzetű átalakitás kell.


Mindegy nézzük a 123 as alatti feletti módositást :


Mivel több számról beszélünk (nem egy vagy kettőről), igy szövegel nem lehet összehasonlitani, ezért át kell alakitani számmá a darabot : Val (Darab1,Szam,Hiba).


Aztán a feltételben a Szam-ot kell vizsgálni és annak függvényében irni a jeleket.


Itt a foráskód a 122-nél kisebb számokra "-"-jelet ir a 123-nál nagyobb számokra "+" jelet ir.


[link]


A hátránya az, hogy nincs szürés - tehát csak számokat irhatsz be (SimkoL módszerével megoldható : #22 hozzászólás : procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);

begin

if not (Key in ['0'..'9', #8, #13]) then Key := #0;

end;


illetve mindig három karakterként kell beirni egy számot (tehát 1-et 001-ként kell beirni).


Kalkulátorkénti megoldásként, ha csak a + és - jelek játszanak zárójelek nélkül akkor végig kell menni a Edit1.Text-en kiszedni az első számot majd a műveleti jelet majd a második számot és elvégezni a műveletet.


Itt van ez is : [link]


Ahogy kipróbáltam müködött, de biztos van benne hiba.


Sok sikert.

üdv.

2015. okt. 2. 20:13
Hasznos számodra ez a válasz?
 74/95 SimkoL ***** válasza:
#67: egyem a kicsi lelked ez nem kalkulátor program, sima string cserélésről, 'takarításról' szól az egész. Az sem sokkal bonyolultabb.
2015. okt. 2. 20:14
Hasznos számodra ez a válasz?
 75/95 coopper ***** válasza:

@SimkoL


Két ciklusban, nem, de egy ciklusban már kiegyezek veled (mivel egy ciklusban, kb azt irtad meg amit én is megirtam - nem néztem meg tüzetesebben - de gondolom nem nagy eltérés lehet a két megoldás között)


Ebből is következik, hogy nincs új a nap alatt.


Az hogy most segéd változóba pakolod a dolgokat, vagy Edit1.Text részét használom, mindenki ahogy szereti, Én igy Te úgy.


Üdv.

2015. okt. 2. 20:20
Hasznos számodra ez a válasz?
 76/95 SimkoL ***** válasza:
Én csak a '122' vagy a '123' előfordulását keresem a stringben, minden mást figyelmen kívül hagyok és újragenerálom, kiszórva a 'szemetet'. Ha a hatékonyságot, gyorsaságot nézzük szerintem gyorsabb a tiednél, de ez itt nem fontos.
2015. okt. 2. 20:46
Hasznos számodra ez a válasz?
 77/95 anonim ***** válasza:

koszonom Coopper!van itt mit atnezni es tanulmanyozni kezdok szamara az biztos. :-) ugyanakkor SimkoL legutobbi peldajaba meg annyira sem tudtam kozben belekontarkodni mint a tiedbe.mintha versenyeznetek ki tudja furabban es bonyolultabban korulirni a kodot. SimkoL peldajanak a vege fele egy edit-be szerettem volna beletenni egy s valtozoval a 122-ot es akarhogy varialtam a "kell-el" es a "seged-del" igy pl, hogy


s:=edit1.text;

if s='122' then ....


vagy

s:=kell;

if s='122' then...


vagy


s:=seged;

if s='122' then...


es meg ossze-vissza vacakoltam a kisebb,nagyobb,nem egyenlo, kisebb-egyenlo, nagyobb egyenlo operatorokkal,meg a sztringbe eredetileg berogzitett '122'-es erteket sem tudtam szimulalni vele sehogy, csak ugy, ha


s:='122'-erteket irtam bele az s valtozoba

es a "kell-t" tettem egyenlove az "s"-el if kell=s modon. amilyen egyszeru olyan gyilkos ez a feladat az en laikus elmemnek.


azt nem ertem mitol ennyire erthetetlen szamomra.


adott ez a feladat tehat:


ha beirasra kerul egy textboxba,hogy 122,vagy alatti ertek + enter lenyomasa utan irjon a 122 utan egy "-" jelet,ha pedig 123 vagy feletti irjon "+" jelet, tehat

elmeletben...


s:=edit1.text;

if s<='122' then edit1.text:=s+'-';

if s>='123' then edit1.text:=s+'+';

if (s=0) or (s<0) then edit1.text:='';


igen am, csak hogy kozben teljes keresest kell vegezni az editboxban,hogy lekezelje azt vegtelen hosszusagban, ezt a pos,strpos,vagy posex fuggvennyel lehet mondjuk elso nekifutasra megoldani.tehat barhol szerepel a 122,vagy a 123, akkor irja utana a megfelelo jelet egy enter lenyomasaval.csakhogy figyelni kell azt is,hogy hol van a sor vege, hol a sor eleje, hol volt a sor vege es hol volt a sor eleje az aktualkis kurzortol szamitva es azt hogy a beirt ertek hosszusaga mennyi. talan pos, insert es delete fuggvenyekkel jobban ertheto lenne, mint a copyval, bar mar elbizonytalanodtam kisse.

2015. okt. 2. 21:37
Hasznos számodra ez a válasz?
 78/95 anonim ***** válasza:

Én vágólapra akarom másolni a szöveget majd azt beilleszteni, így oldjátok meg azt is. Ugyan úgy csak az a 2 szám szerepelhessen, + és - jelek legyenek beillesztve.


(Elsősorban a kód szépségére kell optimalizálni, majd ha az adott feladathoz lassú a program akkor elemezni és felturbózni)

2015. okt. 2. 21:45
Hasznos számodra ez a válasz?
 79/95 anonim ***** válasza:
Mondom én hogy film lesz belőle.:-D Annak idején mondjuk a kérdező által is korábban említett TV Basic-ben elsütöttek volna egy ilyen feladatot a kezdőknek input bekérés nélkül,nekib@@szták volna TV-nek a Commodore-t. Abban az időben és a legegyszerűbben most is úgy oldható meg egy ilyen jellegű feladat prognyelv függetlenül, ha mindent szépen bekérünk a felhasználótól, gondolva arra, hogy szinte 90%-ban átlagfelhasználók fognak ilyennel kísérletezgetni és nem guruk, és az alapján íratjuk ki a különböző és szerteágazó végeredményeket is. Csak tudnám ki a jó franc gépel ennyit parancssorban manapság,mikor mindenki vagy kattint,vagy éppen érint valamit.Ugyanakkor a parancssor paraméterezéseknél,vagy "kód" készítéseknél, vagy éppen "kulcs" mahinálásoknál valóban fel lehet használni rendesen kicsit átalakítva,de hogy ezen kívül szerintem semmire az is eléggé valószínű, ha nem éppen egy kalkulátort készítünk mondjuk belőle. Persze könnyű mondani annak mint nekem, aki szinte sz@@rt sem ért a pascalhoz :)))
2015. okt. 2. 22:03
Hasznos számodra ez a válasz?
 80/95 anonim ***** válasza:
mondjuk igaz amit irsz valahol egy idealis vilagban csak eppen nem ebben a feladatban.ugyanakkor mar engem is kivancsiva tettel azzal,hogy vajon az eredeti kerdes kiiro mire hasznalta ezt fel,mert ha nem egy Coopper fele kalkulator sul ki belole a vegen,ami ertheto es hasznalhato,akkor o vajon mit kezdett ezzel az egesszel.hat ezt nem valoszinu hogy megtudjuk,mert valszinu csak egyszeri alkalommal volt erdekes neki meg meg nem oldottak aztan ugy eltunt mint szurkeszamar a kodben,mert azota egyszer sem volt itt trecselni.szepen elkoszont aztan tovabbalt, mint aki jol vegezte dolgat.
2015. okt. 2. 22:22
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!