Positionner le curseur de la souris sur la ligne souhaitée quand on clique sur le noeud d'un TTrewView
Salut à tous !!!
D'avance désolé pour ceux qui trouveront ma question déplacée. Mais bon comme je cherche la solution, pour bien maitriser le sujet, je préfère poser simplement ma question, puisque je suis convaincu que d'autres personnes ont la solution que je recherche.
Mon problème est ceci :
Je suis entrain de développer un logiciel d'étude biblique, et donc j'ai mis tous les livres dans un TTrewView (je mettrai une capture d'écran pour vous donner une idée). Ce que je souhaite faire maintenant, c'est que lorsque l'utilisateur clique sur un verset d'un livre quelconque (je précise qu'une bible est un ensemble de 66 livres), que le curseur de la souris se déplacer sur le verset du livre en question.
Pour le moment, voici ce que moi je fais (je mets le bout de code que j'utilise dans une balise "code") :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
//Ce premier bout de code appelle la deuxième fonction en bas
// Je positionne le curseur
for (int i = 0; i < GrBPanelPages->ControlCount; i++) {
if (GrBPanelPages->Controls[i]->Name == "RDetailsGe") {
if (((TRichEdit *)(GrBPanelPages->Controls[i]))->CanFocus()) {
SetCurseurPosition(grandPere,
((TRichEdit *)(GrBPanelPages->Controls[i])), chapitre, verset);
}
}
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
// Voici la fonction qui est appelée par le bout de code ci-dessus
void __fastcall TFormBJesusChrist::SetCurseurPosition (
TTreeNode * grandPere, TControl * controlUse,
UnicodeString chapitre, int verset)
{
// On donne le focus
((TRichEdit *)controlUse)->SetFocus();
// Pour changer la couleur
int numLigne = ((TRichEdit *)controlUse)->Lines->Count;
FProgressBar = new TFProgressBar (this, 0, numLigne);
FProgressBar->LabelOfUserToNormal->Visible = true;
FProgressBar->Show();
PutColorInTextOfBook (controlUse);
// on récupère le nom
int nbLines = 0;
if (m_ListeOfGrandPereEnCours != NULL &&
m_ListeOfGrandPereEnCours->Count > 1) {
nbLines = GetNbLinesOfListeOfGrandPeres (
m_ListeOfGrandPereEnCours, grandPere, chapitre);
}else {
nbLines = GetNbLinesOfListeOfChapitres (
m_ListeOfChapitresEnCours, chapitre);
}
// Pour positionner le curseur
int correction = 0, pas = 0;
if (fmod (nbLines, 2) == 0) {
pas = nbLines + nbLines / 2;
}else {
pas = nbLines + nbLines / 3;
}
correction = (pas < nbLines) ? pas : nbLines;
((TRichEdit *)controlUse)->SelStart =
((TRichEdit *)controlUse)->Perform (EM_LINEINDEX,
correction + nbLines + verset - 1, 0);
FProgressBar->Close();
} |
Cela fonctionne, mais il ne positionne pas le curseur sur la ligne exacte que je désire. Et pour corriger cela, j'ai fait des gimnastiques, en créant des pas et des variables pour corriger le problème de positionnement exact sur la ligne désirée, mais rien n'est fait.
Alors si quelqu'un a compris mon problème et peut m'aider, je suis preneur. Je crois que tout est possible à celui qui croit, donc je crois que je trouverai la solution avec vous. Merci d'avance pour vos réponses. S'il y a des points pas trop clairs, écrivez-moi, je vous répondrai.
Merci.
1 pièce(s) jointe(s)
Envoi de la capture d'écran
Citation:
Envoyé par
gandf
Bonjour,
Je pense qu'il est difficile de répondre sans avoir une capture d'écran du programme lancé et une autre de la fenêtre en édition dans C++Builder.
La référence de position est parfois relative à un autre composant qui peut lui-même avoir une position relative.
Il faut donc voir exactement ce que vous essayez de faire pour trouver le bon calcul.
Merci Gandf pour ta réponse. Je viens de faire une capture d'écran du programme que j'ai laissé sur mon pc. J'ai mis en surligne jaune l'emplacement de la souris après exécution (ligne EX1V7), et j'ai fait une surligne rouge sur le numéro de la ligne EX1V12 qui devait être en haut (car juste sur le coté gauche, dans le scrollbar, la ligne sélectionnée est en gras et c'est "Verset 12"), à la place de la ligne EX1V7.Pièce jointe 180776