(Часть 2) Я начинающий, подскажите пожалуйста как...
Прежде чем задать вопрос здесь, вы обязаны использовать
- Поиск по форуму, используя ключевые слова из вашего вопроса. Как правильно использовать поиск - читайте здесь
- Список наиболее часто задаваемых вопросов (FAQ)
- Поиск по предыдущей теме
Кроме того, прежде чем размещать сообщение, ознакомьтесь с правилами.
При размещении вопросов начинающих помимо указанной темы, будет выдаваться нарушение, а тема удаляться.
но если у вас установлена ДДК - то вы можете использовать либ-файл - но вероятно только в вижуал студии (возможно путем использования различных бубнов это можно и в борланде - но честно говоря не пробовал - если у вас получится опишите)
Я к сожалению без наглядного примера такое реализовать немогу.А гугл находит примеры только для майкрософтского вижуал студио.Которые на борланде выдают примерно такое
код надо приводить полностью...
какие наглядные примеры вам еще нужны? Как импортировать функции пример есть в ФАКе да и тема обсуждалась множество раз. То что это тема для начинающих - это вовсе не значит что ньюбам здесь будет расписан код который вам останется только откопипастить. Тем более если вы беретесь за системное программирование.
Думайте головой, используйте поиск и читайте литературу.
символ '\t' уже не актуален?
Я же написал что символы табуляции которые есть в строке почему то(как и переноса строки,пробелы)заменяются на "квадратики"
Стиль LBS_USETABSTOPS при создании ListBox'а.
{
private:
protected:
public:
void __fastcall CreateParams(TCreateParams &Params);
void __fastcall CreateWnd();
__fastcall TMyListBox(Classes::TComponent* AOwner) : TListBox(AOwner){};
};
void __fastcall TMyListBox::CreateParams(TCreateParams &Params)
{
TListBox::CreateParams(Params);
Params.Style = Params.Style | LBS_USETABSTOPS;
}
void __fastcall TMyListBox::CreateWnd()
{
TListBox::CreateWnd();
int HorzBaseUnit = LOWORD(GetDialogBaseUnits());
int tabarray[4] = {100, 200, 800, 900};
for (int index = 0; index < 4; index++)
tabarray[index] = (tabarray[index] * 4) / HorzBaseUnit;
Perform(LB_SETTABSTOPS, (WPARAM)4, (LPARAM)tabarray);
Perform(LB_SETHORIZONTALEXTENT, 900, 0);
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
TMyListBox* mlb = new TMyListBox(this);
mlb->Parent = this;
mlb->SetBounds(20,20, 300, 300);
mlb->Visible = true;
mlb->Items->Add("\tстрока1");
mlb->Items->Add("\tстрока2");
mlb->Items->Add("\tстрока3");
}
просто так поменять стиль не дает хз. почему?
Как можно сохранить динамически созданные объекты(в частности картинки)???
Как можно сохранить динамически созданные объекты(в частности картинки)???
У наследников TGraphic есть метод:
TGraphic::SaveToFile
TGraphic::SaveToFile
А можно сохранить несколько объектов в один файл, с сохранением их координат?
#ifndef loadmoduleH
#define loadmoduleH
#include <SysUtils.hpp>
//---------------------------------------------------------------------------
extern "C" __declspec(dllexport) HWND LoadForm();
#endif
//loadmodule.cpp
#pragma hdrstop
#include "loadmodule.h"
#include "main.h"
//---------------------------------------------------------------------------
HWND LoadForm(){
TfmMain *fmMain = new TfmMain(NULL);
fmMain->ShowModal();
delete fmMain;
return 0;
}
можно. реализовав собственный класс графического объекта например.
{
private:
protected:
public:
void __fastcall CreateParams(TCreateParams &Params);
void __fastcall CreateWnd();
__fastcall TMyListBox(Classes::TComponent* AOwner) : TListBox(AOwner){};
};
void __fastcall TMyListBox::CreateParams(TCreateParams &Params)
{
TListBox::CreateParams(Params);
Params.Style = Params.Style | LBS_USETABSTOPS;
}
void __fastcall TMyListBox::CreateWnd()
{
TListBox::CreateWnd();
int HorzBaseUnit = LOWORD(GetDialogBaseUnits());
int tabarray[4] = {100, 200, 800, 900};
for (int index = 0; index < 4; index++)
tabarray[index] = (tabarray[index] * 4) / HorzBaseUnit;
Perform(LB_SETTABSTOPS, (WPARAM)4, (LPARAM)tabarray);
Perform(LB_SETHORIZONTALEXTENT, 900, 0);
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
TMyListBox* mlb = new TMyListBox(this);
mlb->Parent = this;
mlb->SetBounds(20,20, 300, 300);
mlb->Visible = true;
mlb->Items->Add("\tстрока1");
mlb->Items->Add("\tстрока2");
mlb->Items->Add("\tстрока3");
}
просто так поменять стиль не дает хз. почему?
К сожалению этот способ мне не подходит :( Может есть какая нибудь альтернатива ListBox которая будет выводит строки с символами табуляции?
TListView
вы можете установить стиль lbVirtual либо lbVirtualOwnerDraw и выводить все что вам заблагорассудится.
Да.....используй OwnerDraw,т.е. собственную прорисовку....
Мда конечно же очень информативно.В листбокс нет не ListBox1->OwnerDraw , не ListBox1->Owner->Draw
вобщето в справке есть пример - как выводить строки с картинками, все что надо - это нажать Ф1
{
Graphics::TBitmap *pBitmap; // temporary variable for item’s bitmap
int Offset = 2; // default text offset width
// note that we draw on the listbox’s canvas, not on the form
TCanvas *pCanvas = ((TListBox *)Control)->Canvas;
pCanvas->FillRect(Rect); // clear the rectangle
pBitmap = (Graphics::TBitmap *)((TListBox *)Control)->Items->Objects[Index];
if (pBitmap)
{
pCanvas->BrushCopy(Bounds(Rect.Left + Offset, Rect.Top, pBitmap->Width, pBitmap->Height), pBitmap, Bounds(0, 0, pBitmap->Width, pBitmap->Height), clRed); // render bitmap
Offset += pBitmap->Width + 4; // add four pixels between bitmap and text
}
// display the text
pCanvas->TextOut(Rect.Left + Offset, Rect.Top, ((TListBox *)Control)->Items->Strings[Index]);
}
я так думаю что много чего упустили. вопервых - обратите внимание - картинки которые выводятся, должны быть загружены в объект. Т.е. ваш код должен быть примерно такой (очисткой памяти и прочим вы занимайтесь сами - это просто пример загрузки рисунка). Я загружаю рисунок из файла по нажатию на кнопку - а вы уже разберетесь сами надеюсь, как вам добыть рисунки из ресурсов - благо на форуме это сто раз обсуждалось.
{
if(!OpenPictureDialog1->Execute())return;
Graphics::TBitmap *pBitmap = new Graphics::TBitmap;
pBitmap->LoadFromFile(OpenPictureDialog1->FileName);
ListBox1->Items->AddObject("Test",pBitmap);
}
void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Index,
TRect &Rect, TOwnerDrawState State)
{
Graphics::TBitmap *pBitmap; // temporary variable for item’s bitmap
int Offset = 2; // default text offset width
// note that we draw on the listbox’s canvas, not on the form
TCanvas *pCanvas = ((TListBox *)Control)->Canvas;
pCanvas->FillRect(Rect); // clear the rectangle
pBitmap = (Graphics::TBitmap *)((TListBox *)Control)->Items->Objects[Index];
if (pBitmap)
{
pCanvas->BrushCopy(Bounds(Rect.Left + Offset, Rect.Top, pBitmap->Width, pBitmap->Height), pBitmap, Bounds(0, 0, pBitmap->Width, pBitmap->Height), clRed); // render bitmap
Offset += pBitmap->Width + 4; // add four pixels between bitmap and text
}
// display the text
pCanvas->TextOut(Rect.Left + Offset, Rect.Top, ((TListBox *)Control)->Items->Strings[Index]);
}
во вторых - обязательно установите стиль lbOwnerDrawFixed или lbOwnerDrawVariable
После динамической загрузки html-странички в TCppWebBrowser неверно работают закладки(взял пример из FAQа). Также из тем форума узнал, что для верной работы необходимо:
1. Получить IHTMLDocument2 (из CppWebBrowser1->Document);
2. Получить коллекцию элементов IHTMLElementCollection (IHTMLDocument2::get_all);
3. Найти нужный элемент (IHTMLElementCollection::item) и вызвать scrollIntoView(TVariant(true)).
Но именно это я и не могу закодировать. Помогите:приведите пожалуйста код!
Спасибо.
После динамической загрузки html-странички в TCppWebBrowser неверно работают закладки(взял пример из FAQа). Также из тем форума узнал, что для верной работы необходимо:
1. Получить IHTMLDocument2 (из CppWebBrowser1->Document);
2. Получить коллекцию элементов IHTMLElementCollection (IHTMLDocument2::get_all);
3. Найти нужный элемент (IHTMLElementCollection::item) и вызвать scrollIntoView(TVariant(true)).
Но именно это я и не могу закодировать. Помогите:приведите пожалуйста код!
Спасибо.
попробуй в примере из ФАК'а № 33 вместо pElement->click();
подтставить pElement->scrollIntoView(TVariant(true));
подтставить pElement->scrollIntoView(TVariant(true));
Попробовал, но дело подпортила строка
pCollection->item(TVariant(WideString(ButtonName)), TVariant(0), &pDisp);
Смотрел описание ф-ции в msdn, но страницы открываются с ошибкой и полного описания я не увидел.
Пробовал вместо ButtonName писать имя закладки, но pDisp возвращается нулевым.
во вторых - обязательно установите стиль lbOwnerDrawFixed или lbOwnerDrawVariable
Если листбок заполнять в цикле то потом при выделение одного итема у нескольких нижних пропадает прорисованная картинка,если выделить итем в котором пропала картинка то она появляется опять.Я так понимаю при выделении итема они все перерисовываются соответственно для каждого из них должен опять срабатывать код в DrawItem .Но вот я немогу понять почему он несрабатывает для нескольких итемов ниже
выделенного :confused:
выделенного :confused:
используйте отладчик - и посмотрите что происходит при перерисовке. Я не телепат, и не могу знать что и как вы делаете - проверьте что все указатели валидны, прочтите внимательно справку по данному событию и по темам которые с ним связаны. в конце концов - это ваша задача и кроме вас ее решать никто не будет.
pCollection->item(TVariant(WideString(ButtonName)), TVariant(0), &pDisp);
Смотрел описание ф-ции в msdn, но страницы открываются с ошибкой и полного описания я не увидел.
Пробовал вместо ButtonName писать имя закладки, но pDisp возвращается нулевым.
Что ты вообще хочешь этим кодом сделать? если перейти к определенному элементу (прокрутить страницу напр.), то у меня все работает.
выделенного :confused:
1. Надо код приводить свой, а то так затруднительно понять в чем дело.
2. Вот это ты видел:
TOwnerDrawState State - т.е. этот параметр и говорит тебе какое состояние у итема - выбран, не выбран, в фокусе, недоступен и т.д. Это надо отслеживать
...
и рисовать соответственно.
{
Graphics::TBitmap *pBitmap = new Graphics::TBitmap;
pBitmap->LoadFromResourceName((int)HInstance,"IDB_BITMAP1");
for(int i=0; i<30;i++)
{
ListBox1->Items->AddObject("qwerty",pBitmap);
}
}
void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Index,
TRect &Rect, TOwnerDrawState State)
{
Graphics::TBitmap *pBitmap;
int Offset = 1;
TCanvas *pCanvas = ((TListBox *)Control)->Canvas;
pCanvas->FillRect(Rect); // clear the rectangle
pBitmap = (Graphics::TBitmap *)((TListBox *)Control)->Items->Objects[Index];
if (pBitmap)
{
pCanvas->BrushCopy(Bounds(Rect.Left + Offset, Rect.Top, pBitmap->Width, pBitmap->Height), pBitmap, Bounds(0, 0, pBitmap->Width, pBitmap->Height), clWhite);
Offset += pBitmap->Width+1; // add four pixels between bitmap and text
}
pCanvas->TextOut(Rect.Left + Offset, Rect.Top, ((TListBox *)Control)->Items->Strings[Index]);
}
При выделение итема видно такое
http://img139.imageshack.us/my.php?image=47176811sz0.jpg Вроде при выделение итема на месте рисунка или пустое место оказывается :confused: или что то перекрывает канву в том месте :confused:
Я хочу нажав ссылку
Напиши в своем HTML-документе так:
<!-- SOMETHING //-->
<a name="Ref"></a><b>Main</b>
Чтобы юзать флэш activeX - я сделал его импорт ocx файла и всё такое. Импорт прошёл по установленному в данный момент ocx в системе - flash9f.ocx.
А если я хочу теперь сделать программу с использованием, например flash8.ocx - как мне удалить текущую версию компонента и установить более старую версию?.. В систему нужный ocx я ставлю, но в билдер не получается. Если просто заново попытаться поставить - пишет, мол, уже установлено, отстань. А как удалить - нигде не нашёл.
Надо удалить его из того пакажда куда ты его поставил и перекомпилить пакадж. Скорее всего это dclusr.
Пусть я определил функцию
void __fascall TForm1::Button1Click(TObject *Sender){...}
С какими параметрами мне ее можно вызвать?
На: Button1Click(); пишет что мало параметров...
на Button1Click(Sender) тоже ругается, пробовал и другие варианты, но видимо не все...
Пусть я определил функцию
void __fascall TForm1::Button1Click(TObject *Sender){...}
С какими параметрами мне ее можно вызвать?
На: Button1Click(); пишет что мало параметров...
на Button1Click(Sender) тоже ругается, пробовал и другие варианты, но видимо не все...
Вызывается так:
Button1Click(Button1); //Можно вместо Button1 исп. Memo1, StringGrid1 и т.п.
Вообще, Sender - это объект, который вызывает Button1Click... Например, удобно использовате, если у тебя 10ть кнопок, а обработчик для всех один... тогда идентифицируешь надатую кнопку по ((TButton*)Sender)->Tag, например ;)
PS: Написано, что Sender - это TObject ;)