Karakterek beszúrása probléma delphiben, van rá megoldá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;
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 :)
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.
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.
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.
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 :-))))
#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 ? :)
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!