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
 61/95 SimkoL ***** válasza:

A rejtjelzés, titkosítás közel sem a programozásról szól. Az csak a megvalósítás eszköze, legyen az bármilyen programozási nyelv. Egyedi kulcsot, jelszót külső jelből kell generálni, amiben semmi logika nincs. Legegyszerűbb megvalósítása, ha fogod a géped mikrofonját, kifordítod az utcára és a felvett zajból generálod a kulcsot. Egyszeri, logikátlan és megismételhetetlen. Igaz, ha zajszegény a környezetben készül akkor rá kell engedni egy programot ami kiszedi ez egymás után 3-5-ször előforduló jeleket.


- A való világban is így müködik csak nem az utcazajból -


Ha érdekel valakit segítek a megvalósításában, de csak Delphi alatt :)

2015. okt. 2. 09:06
Hasznos számodra ez a válasz?
 62/95 anonim ***** válasza:
hm
2015. okt. 2. 13:30
Hasznos számodra ez a válasz?
 63/95 anonim ***** válasza:
engem SimkoL inkabb az elozo program atlathatosaga erdekelne amit coopper irt es az hogy osszeadja es ki is vonja egymasbol az adott ertekeket, meg az hogy pl hogyan lehet szetvalasztani a 122 alattiakat es a 123 felettieket hogy azokat is ertelmezze es elfogadja,mert ez szerintem egymagaban tovabbra is ertelmetlennek tunik. persze egyetertek azzal az elozo hozzaszoloval aki lehetoseget lat benne felfedezni a kulcskeszitesben,de attol meg ez a program onmagaban veve semmire sem hasznalhato ebben a formaban.legalabb szemleltene hogyan mukodik egy mezoben az osszeadas es kivonas,de ez meg arra sem alkamas.tehat kalkulatornak sem allja meg a helyet sajnos.
2015. okt. 2. 13:39
Hasznos számodra ez a válasz?
 64/95 SimkoL ***** válasza:
Ahogy látom coopper az Edit1.Text mezőt dinamikus karaktertömbként kezelte és a végén eléggé belebonyolódott. A program nem az összeadásról és kivonásról szól, hanem adott karaktersorozathoz tartozó karakter beszúrásáról. Mondjuk én inkább egy másik stringbe 'dobáltam' volna a kiválogatott 122 és 123 karaktersorozatokat - értelemszerűen + és - hozzáadásával - egy PosEx fgv. segítségével. Cooper talán a legbonyolultabb megoldást választotta.
2015. okt. 2. 14:52
Hasznos számodra ez a válasz?
 65/95 coopper ***** válasza:

Nem bonyolódtam bele, csak a menet közben adódott problémákat próbáltam megoldani.


Nekem csak annyi a problémám, hogy nem nézem a delphi beépitett fügvényeit (csak azokat amiket ismerek - és a többinek nem nagyon szoktam utánna nézni), megpróbálom megoldani saját magam, aminek az lesz az eredménye, hogy ujra felfedezem a "spanyol viaszt" mivel ilyenkor megirok egy "beépitett" függvényt - és valószinűleg rosszabbul irom meg mint azt a delphiben meg van irva - illetve amit irok azt meg lehetne oldani beépitett függvénnyel is.


Mint ahogy ennél a #14-es hozzászólásomnál is, de leirom a magyarázatokat is, mert úgy látom, lehet hogy ez segit egy-két embernek :


A feladat ismert : 122- illetve 123+ jelek beirása Enter-re Edit mezőben.


Meghatározom a edit text mező hosszát ez lesz Hossz változó

Inditok egy ciklust ez leszt I (modjuk ezt már rögtön lehetne háromtól inditani akkor megspórolnénk egy-két if-et - de első felindulásban nem optimalizáltam, aztán másodikban sem : if I>=3 then Darab1:=copy (Form1.Edit1.Text,I-2,3);, stb,stb)


Ha tudok egy három karakteres darabot levágni a edittext mezőből akkor azt levágom, de mindig visszafelé vágok, tehát aktuális pozició-2-től aktuális pozicióig (ez 3 karakter) ez lesz Darab1.


Illetve ha tudom, akkor az aktuális utáni poziciót kiveszem ez lesz darab2 (ez azért kell mert ha már egyszer megnyomtam az entert és bekerültek a megfelelő jelek -/+ akkor ujabb enter megnyomásra ha nins kiszűrve a dolog akkor ezek a jelek duplikálódnak - mivel újra beszúrásra kerülnek.


Aztán már csak el kell végezni a vizsgálatokat, miszerint Darab1 az 122 vagy 123 (tehát magyarul kel utánna tenni jelet vagy nem) illetve meg kell nézni, hogy van-e utánnuk "-" vagy "+" jel. Ezt vizsgálja a Darab2 feltétel (ezt az logikai algebrát meg lehetne oldani és akkor nem lenne ilyen "csúnya", de igy is megcsinálja a gép amit kell, igy én ezt nem oldom meg - mig a logikai algebra megoldásánál véthetek hibát, ha rosszul oldom meg).


Ha teljesül a feltétel akkor fogom edit1 text mezejét és levágom az aktuális pozicióig hozzáadok egy - vagy egy + jelet illetve még a végéhez hozzáadom az Edit1 Text mezejének fenmaradó szövegét és visszateszem Edit1.text-be.


Illetve beálitom a cursor pozicióját az Edit mezőben


Hát nagyjából ennyi.


Üdv.

2015. okt. 2. 16:26
Hasznos számodra ez a válasz?
 66/95 coopper ***** válasza:

A másik dolog meg, talán azért nem is használom a "StringReplace" függvényt mer nem nagyon lehet vele gyorsítani a programot, sőt inkább lassítani lehet vele.


SimkoL #29-es hozzászólásában 11 darab "StringReplace" függvény van - feltéve ha jól számoltam.


Most ez nekem azt jelenti, hogy 11-szer fog végigmenni a teljes szövegen a "StringReplace" függvény (szerintem végig kell neki menni a teljes edit1.text mezőn, ahhoz hogy jól működjön). Akármilyen optimálisan is van megírva a "StringReplace" függvény, szerintem 11 végigmenetel és 1 végigmenetel között van eltérés, (az egy végigmenetelt az én megoldásomra értem) főleg ha hosszabb mondjuk 500-600 karakteres (esetleg még ennél is hosszabb) szöveget nézünk.


Amúgy nem is olyan egyszerűen van megírva ez a string replace (persze értem én hogy univerzális meg minden fajta kódolású szövegbe tud cserélni, de akkor is).


Nálam a c:\Program Files\Borland\Delphi7\Source\Rtl\Sys\SysUtils.pas-ban a következő található string replace alatt, ami elég bonyulúltnak tűnik, igy első ránézésre is (és meg kell mondanom még másodikra is) :


function StringReplace(const S, OldPattern, NewPattern: string;

Flags: TReplaceFlags): string;

var

SearchStr, Patt, NewStr: string;

Offset: Integer;

begin

if rfIgnoreCase in Flags then

begin

SearchStr := AnsiUpperCase(S);

Patt := AnsiUpperCase(OldPattern);

end else

begin

SearchStr := S;

Patt := OldPattern;

end;

NewStr := S;

Result := '';

while SearchStr <> '' do

begin

Offset := AnsiPos(Patt, SearchStr);

if Offset = 0 then

begin

Result := Result + NewStr;

Break;

end;

Result := Result + Copy(NewStr, 1, Offset - 1) + NewPattern;

NewStr := Copy(NewStr, Offset + Length(OldPattern), MaxInt);

if not (rfReplaceAll in Flags) then

begin

Result := Result + NewStr;

Break;

end;

SearchStr := Copy(SearchStr, Offset + Length(Patt), MaxInt);

end;

end;


Úgy hogy SimkoL, jó és egyszerűnek néz ki a megoldásod, de szerintem lassabb mint az én megoldásom.


Üdv.

2015. okt. 2. 16:47
Hasznos számodra ez a válasz?
 67/95 anonim ***** válasza:

na most a leirasod alapjan legalabb eljutottam odaig hogy tobb szamra ir ki minusz erteket,de a 123-at elrontja.annyira zavaros ez az egesz hogy kotve hiszem barki megertene,mert en biztosan nem ertem sajna.mindazon altal tovabbra sem a tertunk ki a lenyegre,hogy hogy lesz belole egy kalkulator program,vagy hogy mukodne ugy peldul,hogy a 123 es az e feletti szamokra plusz jelet ir ki a 122-re es az az alatti szamokra pedig negativat.ez a forraskod nem alkalmas erre vhogy, ahhoz teljesen masikat kell irni? durva lenne osszedobni egy ilyet hogy atlathato legyen?



var

Form1: TForm1;

proba:string;

implementation


{$R *.dfm}



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

Var Hossz : longint ;

var I: longint ;

var Darab1: string;

var Darab2: Char;


begin

if Key=13 then begin

Hossz:=length (Form1.Edit1.Text);

I:=0;

while I<=Hossz do begin

I:=I+1;

Darab1:='';

Darab2:=#0;



if I>=3 then Darab1:=copy (Form1.Edit1.Text,I-2,3);

if I<=Hossz-1 then Darab2:=Form1.Edit1.Text[I+1];


proba:=edit1.text;

if darab1>proba then

if (I>=3) and (Darab1=darab1) and (not ((Darab2='-') or (Darab2='+'))) then begin

Form1.Edit1.Text:=copy (Form1.Edit1.Text,1,I-1)+'-'+copy (Form1.Edit1.Text,I+1,Hossz-1);


I:=I+1;

Form1.Edit1.SelLength:=0;

Form1.Edit1.SelStart:=I;

end ;



if (I>=3) and (Darab1='123') and (not ((Darab2='-') or (Darab2='+'))) then begin

Form1.Edit1.Text:=copy (Form1.Edit1.Text,1,i)+'+'+copy (Form1.Edit1.Text,I,Hossz-1);

I:=I+1;

Form1.Edit1.SelLength:=0;

Form1.Edit1.SelStart:=I;

end ;

Hossz:=length (Form1.Edit1.Text);

end ;

end ;

end;

end.

2015. okt. 2. 18:54
Hasznos számodra ez a válasz?
 68/95 anonim ***** válasza:

Haláliak vagytok szerintem szóljunk Spielbergnek,hogy ugorjon rá ő is erre a témára, el tudnám képzelni egy misztikus thrillernek is


Bemutatjuk... A 123+ 122- című filmet,

rendezte: Steven Spielberg


Készült egy ismeretlen spanyolviasz feltaláló programozó nyomán.


Pusztuljak el ha nem lehetne sztorit készíteni belőle :-))))

2015. okt. 2. 19:13
Hasznos számodra ez a válasz?
 69/95 anonim ***** válasza:
latom fantaziabol jeles vagy,de inkabb probaljuk megoldani a dolgot
2015. okt. 2. 19:18
Hasznos számodra ez a válasz?
 70/95 SimkoL ***** válasza:

#coopper: valóban sok a StringReplace, közel sem kellett volna ennyi, csak nem volt, lett volna kedvem magyarázni, de most mutatok egy másik megoldást:


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

var honnan, i: integer;

seged, kell : string;

begin

if Key = 13 then

begin

seged := '';

for i := 1 to Length(Edit1.Text) do if Edit1.Text[i] in ['1'..'3'] then Seged := Seged + Edit1.Text[i];

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;


Gyorsaságban már két ciklusban kiegyezünk ? :)

2015. okt. 2. 19:23
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!