begin process at 2010 02 10 07:22:28
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > UNIT POSITION_BY_COLOR

UNIT POSITION_BY_COLOR


 Information sur la source

Note :
Aucune note
Catégorie :Divers Classé sous :position, bouton, unit Niveau :Débutant Date de création :26/12/2005 Date de mise à jour :08/02/2006 20:40:21 Vu / téléchargé :2 778 / 186

Auteur : DeltaFX

Ecrire un message privé
Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Pour illustrer une idée postée dans le thread de Mauricio : http://www.delphifr.com/code.aspx?ID=30296

Une petite Unit pour positionner des boutons.... etc (du moment que la chose a des propriétés Top/Left/Width/Height) sur une form, à partir d'un bmp (fond blanc obligatoire) et des rectangles de couleurs.


Toute les remarques sont les bienvenues, j'apprends en meme temps :)



 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

26 décembre 2005 15:21:24 :
Syntax highlight bizarre....
26 décembre 2005 15:26:55 :
Toujours cettecoloration syntaxique.... pas glop.
27 décembre 2005 13:46:53 :
Modif pour accroitre la vitesse : test d'un pixel sur 2( en x et y ) donc 4 fois plus rapide pour scanner le fond de l'image, toujours aussi lent pour identifier les rectangles pour l'instant, la meme astuce sera ajoutée un peu plus tard.
27 décembre 2005 13:47:49 :
Modif pour accroitre la vitesse : test d'un pixel sur 2( en x et y ) donc 4 fois plus rapide pour scanner le fond de l'image, toujours aussi lent pour identifier les rectangles pour l'instant, la meme astuce sera ajoutée un peu plus tard.
28 décembre 2005 13:35:44 :
Ajout d'un zip.
29 décembre 2005 19:54:11 :
Remplacement des acces aux pixels eux-meme par un scanline, 10 fois plus rapide.
01 janvier 2006 18:22:36 :
Testé avec un bmp de 800*480 : 25 millisecondes pour construire une liste de 13 rectangles colorés Il y avait une possibilité de tomber dans une boucle infinie... Regardez bien les deux rectangles jaune collés mais décalés dans le fichier layout.bmp. Avec la précédente version, le prog ne comprenait pas le décrochement et bouclait ad lib. Bon ben now ca marche ! Mais ca se fait au prix de 10ms supplémentaire. Je merge ligne a ligne des rectangles de meme couleur. Bon enfin 25ms c'est pas grave grave, rassurez moi ?.
04 janvier 2006 19:21:43 :
Blindé et accéléré. Limites : 1- Arrangez vous pour que les zones qui vous interressent, c.a.d les rectangles pour positionner vos Controls soient des rectangles, et pas des trucs tarabiscotés. Ou sinon ayez bien en tete que cette unit vous renverra le plus petit rectangle englobant. Modifiez le LAYOUT2.bmp pour tester. 2- Un rectangle de moins de 2 pixels de hauteur sera transformé en rectangle de 2 pixels de haut, de part l'algo. (En théorie ca devrait pas gener des masses....)
08 février 2006 20:40:21 :
Dernier update, la bestiole est mature. Ajout d'un "break" dans les fcts GetTLWH & GetBoundRect ( histoire de pas scanner pour rien) Ajout donc de GetBoundRect pour récuperer les coords réélle du rectangle, et pas le bricolage de GetTLWH, je trouve ca plus propre pour positionner un control(fct placeControl). Ouala.

 Sources du même auteur

Source avec Zip Source avec une capture PLAYER MP3, REGIONS ET PLAYLIST EVOLUTIONS

 Sources de la même categorie

Source avec Zip Source avec une capture LOGICIEL DE DIAGNOSTIC AUTOMOBILE KWP2000 par Oniria
Source avec Zip Source avec une capture RÉGLE TRANSPARENTE POUR MESURER UN OBJET ECRAN par dubois77
Source avec Zip Source avec une capture LE BOOK DU PAUVRE par dubois77
Source avec Zip Source avec une capture CAHIER 90 PAGES par dubois77
Source avec Zip Source avec une capture TABLEAU DE BOUTONS DYNAMIQUES (AGENDA) par dubois77

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture UN JOLI BOUTON ! par Bacterius
Source avec Zip Source avec une capture TANGENT PACK [COMPOSANTS] par Bacterius
Source avec Zip MÉMORISE SIMPLEMENT LA POSITION ET LA TAILLE DE VOS FENÊTRES par RURUInc
Source avec Zip Source avec une capture TSELECTBUTTON-TPOTENTIO-TTRACKBARVALUE par Francky23012301
Source avec Zip Source avec une capture COMPOSANT BOUTON AVEC DÉGRADÉ ET PETITE ANIMATION par N_M_B

Commentaires et avis

Commentaire de MAURICIO le 27/12/2005 18:45:57

Il vaudrait mieux peut-être que tu mettes un exemple ds un zip...

Commentaire de DeltaFX le 28/12/2005 12:46:00

Exact ! je ponds ca et j'ajoute.

Commentaire de f0xi le 28/12/2005 18:02:23 administrateur CS

mmm pas mal interressant niveau recherche d'une zone de couleur dans un bitmap mais peut etre pas la meilleure solution pour disposer des elements sur une fiche.

pourquoi ne pas utiliser le ScanLine qui est plus rapide que l'utilisation de Pixel ?

en tout cas bon boulot.

Commentaire de MAURICIO le 28/12/2005 18:42:43

Le ScanLine est bien plus rapide en effet.
Par contre, le contrat est rempli même si on peut optimiser simplement en transformant le bmp en 256 couleurs, voire 16 couleurs :)

Je vais peut etre faire un update à mon compo pour implémenter cette fontion si ça interesse des personnes ...
A+

Commentaire de DeltaFX le 29/12/2005 11:14:55

Aheuh Scanline... va falloir que je regarde.

C'est vrai que c'est pas la meilleur maniere de positionner des compos, mais en fait j'avais besoin d'un truc dans le genre (récuperer un rectangle) pour positionner et conditionner un tableau de tlabels : recuperer le rectangle, se dire qu'on veut n  labels dans le rectangle , donc calcul des position de chaque label etc etc, voir mon autre source :

http://www.delphifr.com/code.aspx?ID=33360

Je voulais me passer des s-template et p-template.

Commentaire de DeltaFX le 29/12/2005 12:55:37

Scanline:

Sur Y ca ne changerait rien, et déja je n'utilise qu'une ligne sur 2. Je pourrais scanner une ligne sur 3 aussi, mais dans l'identification des retctangle, ca alourdit la recherche du coin supérieur gauche du rectangle.

Sur x, mouaip, mais je devrais quand meme explorer "pixel" à "pixel" le resultat du scanline. Pour pas réexplorer chaque ligne d'un rectangle identifié, je fais un "jump" hors du rectangle, donc pas possible d'utiliser un "for" car je devrais modifier l'indice du compteur, ce qui me déplait, et donc je dois garder un while.

Mainteant si acceder au n-ieme élément du scanline me prend carrément moins de temps que de regarder le n-ieme pixel de la ligne y du bitmap, ouaip, je vais tester. :)

Commentaire de DeltaFX le 29/12/2005 19:46:41

Testé avec un scanline (et toujours le scan d'une ligne sur 2, et d'un pixel sur 2) : gain d'un facteur 10. Exemple en 800*480 scanné en 15 millisecondes. Ca commence à être sympa.

Commentaire de f0xi le 30/12/2005 20:28:06 administrateur CS

bravo! belle nouvelle performance.

comme tu dis, le resultat est sympa. 15ms c'est mieux que 140ms a l'origine, un gain non negligeable.

moi je considere une performance bonne quand les resultats sur un gros traitement donne a moins de 70ms.

15ms la ... c'est carrement acceptable.

sinon, pourquoi ne pas simplement utiliser une template XML ou pseudo-sctructuré-XML ?

genre :

<newzone><z>numero</z><r>left,top,width,height</r></newzone>

ou a la francis :

%numero{left,top,width,height}

ce serais moins lourd et plus simple ne pense tu pas ?


en tout cas ton truc reste interressant pour le skinning d'appli.

Commentaire de DeltaFX le 30/12/2005 21:36:51

Ouais. Je pensais au XML au lieu d'un fichier ini.

En fait y a 2 raisons pour lesquelles j'ai fait ca :

1- Si je n'utilisais pas le compo de Mauricio je me serais dirigé vers le XML. Mais voila, vu que j'utilise un mask pour definir les boutons et que le composant de Mauricio n'affiche pas les couleur d'un masque quand elles ne sont pas référencées comme un bouton, je peux mettre mes rectangles dans ce meme masque. Le fichier de config d'un prog ne contient plus qu'une couleur, au lieux de 4 integers.

En gros tout benef pour cette utilisation particulière. Et effectivement j'ai pensé à ca pour faire du skinnable. Apres plus qu'a faire un prog pour skinner et 5 images en tout pour une form.

2- J'avais envie de faire un truc différent.

Commentaire de DeltaFX le 31/12/2005 22:00:40

Addendum : Je vais devoir réécrire un bout du code car il y a une possibilité de boucle infinie, et j'aime pas.

Je vais explorer du coté des régions, histoire d'etre étanche si la tache colorée est pas parfaitement rectangulaire.

En gros à chaque ligne explorée, dès que j'ai un pixel pas blanc, je crée une region (1 pixel de haut et n de long). Si cette région à la meme couleur qu'une déja vue, je fusionne, sinon je crée une nouvelle ligne dans l'AreaColorList. Et ainsi de suite.

A la fin , GetRgnBox pour avoir le rectangle englobant de chaque région et zoooooo !

Ca sera peut-etre pas aussi rapide, mais niveau sécurité, impossible d'avoir un cercle visqueux.

Bonne Année 100000000110  :)

Commentaire de DeltaFX le 02/01/2006 21:10:54

Yep, bonne idée ! :)

(En fait j'ai pas encore choppé le pli de penser que tout ce que j'ai à l'ecran est un "Control" et peut etre adressé/utilisé de cette manière.)

Commentaire de DeltaFX le 03/01/2006 00:19:43

Je l'ai réécrit comme ca :

procedure PlaceCtrl(const Ctrl: TControl);
var
  R: TRect;
begin
  if GetTLWH(Ctrl.Tag, R) then
  begin
    Ctrl.Left   := R.Left;
    Ctrl.Top    := R.Top;
    Ctrl.Width  := R.Right;
    Ctrl.Height := R.Bottom;
  end;
end;


procedure BrowseControls(const Main: TWinControl);
var
  I: Integer;
begin
  for I := 0 to Main.ControlCount -1 do
  if Main.Controls[I].Tag <> 0 then
    PlaceCtrl(Main.Controls[I]);
end;

Il se peut que certains ne doivent pas etre repositionnés, et comme il me faut de toute manière lire la couleur utilisée par chaque Control dans un .ini, dans le FormCreate je regle au cas par cas comme suit:

B1.Tag:=RGB(255,0,128); // sera remplacé par une lecture de Ini
PlaceCtrl(B1);

Une putain de bonne idée. Merci Florenth.

Commentaire de f0xi le 14/01/2006 21:15:52 administrateur CS

ton programme, amelioré c'est encore.
fier de toi, mon jeune ami je suis.

une bonne année a tous je vous souhaite.

Commentaire de wolf691300 le 22/01/2006 18:45:43

Pour améliorer ton programme, y placer un peu de finesse dans son ensemble, j'y vois une représentation fort grossière dans le graphisme. Aller améliore ...Et bonne continuation ... J'ai l'impression de voir des oeux déposé par des cloches ...

Wolf691300 + Joyeuses Pâques ...

Commentaire de DeltaFX le 06/02/2006 16:20:01

Mais kékidi lui ? Le prog on s'en tape, c'est l'unit Poisition-by-color qui est importante. Or elle est mature là.

J'ai juste ajouter ca :
//--------------------------------------------------------
function GetBoundRect(aColor:TColor; var aRect: TRect): boolean;
var i:integer;

begin
  Result:=False;
  for i:=0 to MaxUsed do
  if AreaColorList[i].Color = aColor then
  begin
    aRect:=AreaColorList[i].Rect;
    Result:=True;
    break;
  end;

end;

//--------------------------------------------------------
procedure PlaceCtrl(const Ctrl: TControl);
var
  R: TRect;
begin
  if GetBoundRect(Ctrl.Tag, R) then
  begin
    Ctrl.BoundsRect:=R;
  end;
end;


Histoire de faire plus dense.

Tu peux clarifier ta remarque WOlf691300 ?

Commentaire de DeltaFX le 08/02/2006 20:46:09

Arf, j'avais juste posté les modifs en commentaire,pas updaté le source. C'est corrigé.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Problème de position de simulation de bouton d'une souris [ par ElecInfoLolo1 ] Salutj'ai trouvé sur le site de delphifr.com les fonctions qui permettent de simuler les touches d'une souris.Ces fonctions fonctionnent correctement, Désactiver bouton ??? [ par matthyeux ] Salut !J'ai un bouton1 qui est activer et quand je cliques sur un bouton vider, je veux qu'il désactive le bouton1. Mais il faut que je cliques 2 fois ProgressBar et blocage [ par ryadus ] Salut;J'ai fait un projet Delphi, mais il est un peu lent à l'execution; ie: lorsque je click sur un bouton ya tout un algorithme dériére et plein de transparence des éléments d'un bouton [ par themaste ] Slt a tous!!Voila, je suis en train de realiser mon premier composant!!Mon but était d'avoir un bouton définit par une image d'icone, un texte, et une Transparence TImage [ par PoPoV83 ] Salut tout le mondeAlors voila,j'ai une Form avec un TImage ou je dessine des traits dont les coordonnees sont calculees lorsque je clique sur un bout Utiliser données d'une boite de dialogue [ par kisskool ] Bon, j'avais posté un message hier mais on m'a envoyé pleins de message pour me dire qu'on avait pas bien capté ce que je voulais . Alors voici une ve info "étiquette" sous un bouton [ par lupoo ] hello, j'aimerai savoir comment faire les étiquettes qui apparaîssent lorsque la souris passe sur un bouton?merci par avance Fenêtre "Multiple" [ par MAsterC ] Salut à tous, bon pour commencer mon programme contien un bouton. Quand on appuie sur le bouton je fait afficher une Form2 (Form2.Show;). Mais si elle Interactivité entre deux applications [ par laurentl2000 ] Voici concrètement ce que j'aimerais faire : J'ai deux applications, l'une comprend un bouton, l'autre un champ texte. Je clique sur le bouton et le c WebBrowser Input [ par Pipoo ] Bonjour à tous,Alors, je commence par la description :-dans mon appli, j'utilise un TWebBrowser pour afficher une page-j'ai trouvé un code qui permet


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,686 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales