cs_lusitano69
Messages postés21Date d'inscriptionmardi 10 octobre 2006StatutMembreDernière intervention26 février 2008
-
22 févr. 2008 à 13:19
cs_lusitano69
Messages postés21Date d'inscriptionmardi 10 octobre 2006StatutMembreDernière intervention26 février 2008
-
23 févr. 2008 à 18:03
Bonjour je m'explique je voudrais avec un string que j ai récupéré(contient des coordonées de X,Y par exemple) remplir un tableau à 2 dimensions mais pour éa récupération du string il est pas mieux de séparer chaque valeur par un espace parce que j'ai des valeurs a 10,14 etc et ça vau2 2 chars mais quand je remplirais mon tableau lui il va les prendre séparement en 1 0 1 4 etc... et je voudrais pas trop..
Voici mon code:
....
var
Form1: TForm1;
implementation
{$R *.DFM}
function ExcludeChars(const S : string; const CS : TSysCharSet) : string;
var pCh : PChar;
L,J,I: integer;
begin
L := Length(S);
J := 0;
for I := 1 to L do
if S[I] in CS then
begin
J := J + 1;
J := L - J;
end;
if J= 0 then
begin
result := '';
exit;
end
else
begin
SetLength(result, J);
pCh := PChar(result);
for I := 1 to L do
if not (S[I] in CS) then
begin
pCh[0] := S[I];
inc(pCh);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Chaine : string;
Resultat : string;
i,j : integer;
tab : array[0..15] of char;
const
Carac_exclu: TSysCharSet = [':','[',']',','];
begin
Chaine := '099:[1,6][1,7][1,8][1,9][1,10][2,5][2,11][3,5][3,11][4,5][4,11][5,6][5,10]:5'; //Exemple pour des points y,x pour dessiner une lettre
Resultat := ExcludeChars(Chaine,Carac_exclu);
Label1.Caption := Resultat[1]+Resultat[2]+Resultat[3]; //Récuperer le code ascii
for i := 4 to length(Resultat) do //la boucle part du 4ème caractere
begin
for j := 0 to length(Resultat) do
begin
tab[j] := Resultat[i];
end;
end;
end;
cs_lusitano69
Messages postés21Date d'inscriptionmardi 10 octobre 2006StatutMembreDernière intervention26 février 2008 22 févr. 2008 à 13:29
P.S j'ai juste créer un tableau normal dans mon code pour faire des essais mais je voudrias réellement stocker dans un à 2 dimensions pour avoir des coordonées X,Y.
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 22 févr. 2008 à 15:44
deux types de tableau possible :
TPtArray = array[0..n] of TPoint;
ou en dynamique
TPtDynArray = array{Y} of TPoint;
pour le stockage de tes points, le mieux etant de ne pas travailler avec des chaines! mais avec des données brute (serait mieux) dans un stream.
ce qui permettrais au lieu de faire des trucs alambiqué de convertion et decoupage de chaine de faire :
type
pPtDynArray = ^TPtDynArray;
TPtDynArray = array of TPoint;
procedure LoadTable(const FileName: string; out PtDa: TPtDynArray);
var
Size : integer;
begin
// ouverture du stream en mode lecture
with TFileStream.Create(FileName, fmOpenRead) do
try
// recuperation des dim du tableau
ReadBuffer(Size, 4);
// preparation du tableau
SetLength(PtDa, Size);
// lecture du tableau
ReadBuffer(PtDa, Size*8);
finally
Free;
end;
end;
cs_lusitano69
Messages postés21Date d'inscriptionmardi 10 octobre 2006StatutMembreDernière intervention26 février 2008 22 févr. 2008 à 20:14
Merci de ta réponse mais a la base mes données des tout mes points sont stocké dans un fichier texte. Je me suis fait aufait une sorte de police moi meme parce que j essaye de faire u affichage style LEDS on peut voir un exemple sur ce site :
les 3 premiers caracteres correspondent au code ascii de la lettre que je rentrerais dans un Edit. La suite c'est mes points X,Y qui correspondent a la forme de la lettre et le dernier caractère après les deux points(:) c'est la largeur de la lettre.
J'ai déja fait ma function pour convertir la/les lettres en code ascii. et aussi fait mon affichage(simple Image)
Après avec ces valeurs ascii que j ai récupéré je voudrais parcourir mon fichier texte à la recherche de la bonne correspondance de lettre
et par la suite stocker les points [1,6][1,9][1,10][2,5][2,8][2,11] etc dans un tableau a deux dimensions qui correnspont aux X,Y de mon TImage. Dans mon tableau je pourrais faire genre:
tab[1,6] := 1
tab[1,9] := 1 etc..
Atribuer la valeur 1 pour dire que la "led" est alumée et l afficher.
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 22 févr. 2008 à 21:19
hehe :
type
TPtDynArray = Array of TPoint;
TLed = record
Ch : char;
ChSize : integer;
PtsCount : integer;
Pts : TPtDynArray;
end;
TLedsData = record
LedCount : integer;
Leds : array of TLed;
end;
procedure LoadTable(const FileName: string; out LD: TLedsData);
var
n : integer;
begin
with TFileStream.Create(FileName, fmOpenRead) do
try
ReadBuffer(LD.LedCount, 4);
SetLength(LD.Leds, LD.LedCount);
ReadBuffer(LD.Leds, LD.LedCount*8);
for N := 0 to LD.LedCount-1 do
begin
ReadBuffer(LD.Leds[N], 9);
SetLength(LD.Leds[N].Pts, LD.Leds[N].PtsCount);
ReadBuffer(LD.Leds[N].Pts, LD.Leds[N].PtsCount*8);
end;
finally
Free;
end;
end;
procedure SaveTable(const FileName: string; const LD: TLedsData);
var
sz: int64;
n : integer;
begin
with TFileStream.Create(FileName, fmCreate) do
try
sz := 4;
for N := 0 to LD.LedsCount-1 do
sz := sz + 9 + (LD.Leds[N].PtsCount*8);
WriteBuffer(LD, sz);
finally
Free;
end;
end;
avous que c'est quand meme plus simple d'utilisation (surtout niveau performance!)
aprés t'as plus qu'a developper un tout petit editeur pour remplir les fichiers.
voila.
sinon travail avec des fichiers INI ce sera carrement plus simple.
Vous n’avez pas trouvé la réponse que vous recherchez ?
{$R
*.dfm}
Uses StrUtils; {Indispensable pour PosEx}
{Déclaration d'un Tableau à deux dimensions}
Type TIntArray = Array[0..1] Of Integer;
TCoordArray = Array Of TIntArray;
{Récupère une chaine inconnue contenue entre deux
chaines connues SLeft & SRight
Renvoie le résultat dans Result et
supprime
SLeft+Result+SRight de S (Permet de passer au suivant)}
Function MidNIncStr(Var S: String;
Const SLeft, SRight: String): String;
Var
PosLeft, PosRight: Integer;
Begin
Result : = EmptyStr;
PosLeft := Pos(SLeft, S);
If
PosLeft < 1 Then
Exit;
Inc(PosLeft, Length(SLeft));
PosRight :=
PosEx(SRight, S, PosLeft);
If PosRight
< 1 Then Exit;
Result : = Copy(S, PosLeft, PosRight - PosLeft);
S := Copy(S,
PosRight+1, High(Integer));
End ;
{Converti deux
valeurs contenues dans une Chaine S séparées par SSep
En entiers et les
place dans un tableau [0..1] Of Integer}
Function GetDblIntVal(Const
S, SSep: String): TIntArray;
Var
Int1, Int2 : String;
Idx : Integer;
Begin
Int1 : = EmptyStr;
Int2 :=
EmptyStr;
Idx := Pos(SSep, S);
If
Idx > 1 Then
Begin
Int1 := Copy(S, 1, Idx-1);
Int2 := Copy(S, Idx+1, High(Integer));
End ;
{Si il y a un
problème lors de la conversion on renvoi -1}
Result[0] : = StrToIntDef(Int1, -1);
Result[1] := StrToIntDef(Int2, -1);
End ;
{Extrait les valeurs entières par deux et les
place dans un tableau
à deux dimensions}
Function GetIntValues(Const
S, SLeft, SRight, SSep: String):
TCoordArray;
Var aStr, ResStr : String;
Begin
aStr : = S;
Repeat
ResStr := MidNIncStr(aStr, SLeft, SRight);
If ResStr <> EmptyStr Then
Begin
SetLength(Result,
Length(Result) + 1);
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 23 févr. 2008 à 10:52
Uses StrUtils; {Indispensable pour PosEx} Function MidNIncStr(Var S: String; Const SLeft, SRight: String): String;
Var
PosLeft, PosRight: Integer;
Begin
Result := EmptyStr;
PosLeft := Pos(SLeft, S);
If PosLeft < 1 Then Exit;
Inc(PosLeft, Length(SLeft));
PosRight : = PosEx(SRight, S, PosLeft);
If PosRight < 1 Then Exit;
Result := Copy(S, PosLeft, PosRight - PosLeft);
S := Copy(S, PosRight+1, High(Integer));
End ;
Tu n'as rien à créer c'est une unité qui est présente dans Delphi
il faut la déclarer dans les "Uses" pour pouvoir utiliser la fonction PosEx
cs_lusitano69
Messages postés21Date d'inscriptionmardi 10 octobre 2006StatutMembreDernière intervention26 février 2008 23 févr. 2008 à 10:57
Je travaille sur Delphi 5 est ce que il existe aussi StrUtils je pense pas sinon il me mettrais pas de message d'ereur soit disant qu'il trouve pas ce Uses.
Tu copies le code ... tu l'enregistres sous StrUtils.pas et tu le places dans le répertoire de ton application et tu peux, normalement, tester mon code
cs_lusitano69
Messages postés21Date d'inscriptionmardi 10 octobre 2006StatutMembreDernière intervention26 février 2008 23 févr. 2008 à 18:03
ArrXY((1,6),(1,7),(1,8)...ect
Une fois que j'ai tout mes points stocker dans mon tableau comment je pourrais faire pour dessiner un rectangle aux coordonés X,Y de mon tableau?? (je veux dessiner un rectangle pour faire un effet de zoom sur l image comme si on voyait des pixels.)