Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Делаем интерактивную подсказку, Помогите, пожалуйста. 
:(
    Опции темы
docwar
Дата 26.9.2006, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Привет!
Решил сделать интерактивную подсказку для объектов формы! smile
Смысл такой: навели мышкой на объект - появилась подсказка на StatusBar'е. Убрали мышку - подсказка тоже... убралась! smile
Только как быть с картинкой или таблицей? Ведь нет у них таких событий как убирание мышки с объекта...
PM MAIL   Вверх
586
Дата 26.9.2006, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Код
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 Application->OnShowHint=AppShowHint;
 Application->OnHint=AppHint;
 Application->HintPause=0;
 // это можно указать в свойствах компонента
 Button1->Hint="This is button";
 Label1->Hint="This is label";
 Image1->Hint="This is image";
 Button1->ShowHint=true;
 Label1->ShowHint=true;
 Image1->ShowHint=true;
 // 
}
//---------------------------------------------------------------------------

void __fastcall TForm1::AppShowHint(String &HintStr, bool &CanShow, THintInfo &hi)
{
 Form1->Caption=HintStr;   // выводит подсказку в заголовок окна (просто неохота было возиться с  StatusBar'ом)
 CanShow=false;             // запрещает вывод подсказки
}

void __fastcall TForm1::AppHint(TObject *Sender)
{
 Form1->Caption="";
}

Можно также юзать компонент TApplicationEvents.
PM   Вверх
docwar
Дата 26.9.2006, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Не пойму как сделать.... вежь нет же у формы событий TForm1::AppShowHint и TForm1::AppHint
Можно немного подробнее?
Тупо скопировать текст - ошибки! smile 
PM MAIL   Вверх
586
Дата 26.9.2006, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Цитата(docwar @  27.9.2006,  00:54 Найти цитируемый пост)
Не пойму как сделать.... вежь нет же у формы событий 

У формы нет, у TApplication - есть, а TForm1::AppShowHint - это всего-лишь член класса TForm1.
PM   Вверх
Bima
Дата 27.9.2006, 06:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



делаешь так:
Код

void __fastcall TForm1::ApplicationEventsHint(TObject *Sender)
{
StatusBar->Panels->Items[0]->Text=Application->Hint;
}


У всех элементов прописываешь hintи ставишь показ хинтов в true


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
docwar
Дата 27.9.2006, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Bima, сделал как ты сказал - с одной подсказкой работает. Как только добавил еще три картинки - ошибки при наведении на них...
Жму на Ок:
Код
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
                 Application->Initialize();
                 Application->CreateForm(__classid(TForm1), &Form1);
                 Application->Run();
        }     //Строка выделена синим цветом. Напротив - зеленая стрелочка.
        catch (Exception &exception)
        {
                 Application->ShowException(&exception);
        }


Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  error.JPG 29,17 Kb
PM MAIL   Вверх
Bima
Дата 28.9.2006, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Интересно, зачем было приводить основной код???
если помещаете код, то нужен код программы!!!

конкретно описываем, что на форме есть, выкладываем сюда код программы, вот тогда реально сможем помочь.

Это сообщение отредактировал(а) Bima - 28.9.2006, 07:33


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
docwar
Дата 28.9.2006, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Код
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
StringGrid1->ColCount = 8;
StringGrid1->RowCount = 12;
StringGrid1->Cells[0][0] = "...";   // opisaniya
...                                                 //zagolovkov
StringGrid1->Cells[7][0] = "...";   //tablici
StringGrid1->FixedCols = 0;
StringGrid1->DefaultDrawing = false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,          //centrirovanie zagolovkov tablici
      int ARow, TRect &Rect, TGridDrawState State)
{
TStringGrid *Grid = (TStringGrid *)Sender;
AnsiString nameCol = Grid->Cells[ACol][ARow];
int Align;
if(!ARow){
Align = DT_CENTER | DT_VCENTER | DT_SINGLELINE;
Grid->Canvas->Brush->Color = clBtnFace;
}
else
{
Align = DT_LEFT | DT_VCENTER | DT_SINGLELINE;
Grid->Canvas->Brush->Color = clWhite;
}
Grid->Canvas->FillRect(Rect);
TRect r = Rect;
DrawText(Grid->Canvas->Handle,nameCol.c_str(),nameCol.Length(),&r,Align);
}


Это и есть код формы.
PM MAIL   Вверх
Bima
Дата 29.9.2006, 07:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Код привели, а компоненты, мне самому выдумывать, какие на форме стоят???
Ладно, судя по коду, компонент там один, хотя не факт, что их много.
Значит так, делаем, все по порядку:
1. Создаем новый проект
2. Кидаем на форму, таблицу, StatusBar, ApplicationEvents, несколько Image, можно для кучи еще несколько Label.
3. Выставляем у элементов StringGrid, Image, Label в дизайнере свойство ShowHint равное true
4. У этих же элементов в дизайнере в свойствах Hint пишем нужную подсказку
5. Кликаем мышкой 2 раза на StatusBar (на форме) и в открывшемся окне жмем кнопку Add New (Ins). То есть разделяем StatusBar на несколько частей (я сделал 3 части)
6. Выбираем в окне Editing StatusBar1->Panels   1 строку (0-TStatusPanel) и в дизайнере меняем witch с 50 на 250 (можно и больше, что бы подсказка уместилась)
7. В Events (в дизайнере)  у ApplicationEvents выбираем OnHint и создаем событие:
void __fastcall TForm1::ApplicationEvents1Hint(TObject *Sender)
туда вводим код:
Код

StatusBar1->Panels->Items[0]->Text=Application->Hint;


Вот и все.

Полученный код:
Код

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
StringGrid1->ColCount = 8;
StringGrid1->RowCount = 12;
StringGrid1->Cells[0][0] = "...";   // opisaniya
//...                                                 //zagolovkov
StringGrid1->Cells[7][0] = "...";   //tablici
StringGrid1->FixedCols = 0;
StringGrid1->DefaultDrawing = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
TStringGrid *Grid = (TStringGrid *)Sender;
AnsiString nameCol = Grid->Cells[ACol][ARow];
int Align;
if(!ARow){
Align = DT_CENTER | DT_VCENTER | DT_SINGLELINE;
Grid->Canvas->Brush->Color = clBtnFace;
}
else
{
Align = DT_LEFT | DT_VCENTER | DT_SINGLELINE;
Grid->Canvas->Brush->Color = clWhite;
}
Grid->Canvas->FillRect(Rect);
TRect r = Rect;
DrawText(Grid->Canvas->Handle,nameCol.c_str(),nameCol.Length(),&r,Align);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Hint(TObject *Sender)
{
StatusBar1->Panels->Items[0]->Text=Application->Hint;
}
//---------------------------------------------------------------------------


У меня все работает, никаких ошибок не выдает.


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
docwar
Дата 29.9.2006, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 24.9.2006

Репутация: нет
Всего: нет



Bima, спасибо! Супер! smile
Чтобы сделать показ подсказки только на StatusBar'е сделал так:
1) ShowHint->true;
2) Hint="|Текст подсказки";
3) void __fastcall TForm1::ApplicationEvents1ShowHint(AnsiString &HintStr,
      bool &CanShow, THintInfo &HintInfo)
{
StatusBar1->Panels->Items[0]->Text=Application->Hint;
}

Но можно-ли ускорить процесс показа подсказки? А то задержка примерно в секунду идет... нехорошо. smile

Это сообщение отредактировал(а) docwar - 29.9.2006, 21:20
PM MAIL   Вверх
Bima
Дата 2.10.2006, 06:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Странно... в StatusBar1 подсказка идет мгновенно!!! а вот подсказка, которая всплывает, имеет задержку, которая выставляет сама винда. Изменить этот параметр можно если поправить реестр (если честно, сам не делал, но когда-то встречал такую информацию)


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
586
Дата 2.10.2006, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Application->HintPause=0;
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1059 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.