Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

StringGrid и все-все-все

12K
25 марта 2008 года
Sholah_Weras
99 / / 04.12.2007
Доброе время суток, товарищи!

Вопросы:

1. Как в ячейку StringGrid'а вывести несколько строк с новой строки?
2. Как текст в ячейке нормировать (слева, по центру, справа)?
3. Как поменять шрифт отдельно взятой ячейки?

4. Как объеденить колонки одной строки?

5. Если с помощью StringGrid'а этого всего нельзя реализовать, то как можно выйти из положения?

Заранее благодарен.
Страницы:
92
25 марта 2008 года
Тень Пса
2.2K / / 19.10.2006
с утра прийду на работу... выложу название компонента, который это всё умеет Excel-like
92
26 марта 2008 года
Тень Пса
2.2K / / 19.10.2006
http://www.profgrid.com/grid.html
12K
26 марта 2008 года
Sholah_Weras
99 / / 04.12.2007
Спасибо, буду брать компонент штурмом.
12K
29 марта 2008 года
Sholah_Weras
99 / / 04.12.2007
Имею еще один животрепещущий вопрос:

Как мне загрузить мой текст в TCppWebBrowser не пользуясь файлами. Чере поток. Перерыл нет, но нашел только примеры с Delphi. Перевести на великий и могучий c++ не вышло (не заладилось со строкой "WebBrowser->Document as IPersistStreamInit").

Кто может, помогите советом.

И еще вопрос.
Надо переконвертировать массив char[n] в WORD;

Заранее благодарен.
11
29 марта 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Sholah_Weras
Имею еще один животрепещущий вопрос:

Как мне загрузить мой текст в TCppWebBrowser не пользуясь файлами. Чере поток. Перерыл нет, но нашел только примеры с Delphi. Перевести на великий и могучий c++ не вышло (не заладилось со строкой "WebBrowser->Document as IPersistStreamInit").

Кто может, помогите советом.



здесь

12K
30 марта 2008 года
Sholah_Weras
99 / / 04.12.2007
Выдается непонятная ошибка на проверке условия. Вроде, делал все по примеру, а не работает. Выдает ошибку "Read of adresses 000000"

Код:
TMemoryStream      *stm  = new TMemoryStream();
    TStringList        *text = new TStringList();
    IPersistStreamInit *psi;

    text->Add("head");

    text->SaveToStream(stm);
    stm->Seek(0,0);

    TStreamAdapter *sa = new TStreamAdapter(stm, soReference);

    if (SUCCEEDED(Web->Document->QueryInterface(IID_IPersistStreamInit,(void **)&psi)))
        psi->Load(*sa);

    delete stm;
    delete text;
    delete psi;
    delete sa;
11
30 марта 2008 года
oxotnik333
2.9K / / 03.08.2007
delete psi; заменить на psi->Release();
delete sa;
это не удаляется
12K
30 марта 2008 года
Sholah_Weras
99 / / 04.12.2007
Дело в том, что дело не доходит до удаления объектов. Вылезает ошибка на проверке условия:

if (SUCCEEDED(Web->Document->QueryInterface(IID_IPersistStreamInit,(void **)&psi)))
psi->Load(*sa);

Тем не менее, исправил. Все та же ошибка.
11
30 марта 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Sholah_Weras
Дело в том, что дело не доходит до удаления объектов. Вылезает ошибка на проверке условия:

if (SUCCEEDED(Web->Document->QueryInterface(IID_IPersistStreamInit,(void **)&psi)))
psi->Load(*sa);

Тем не менее, исправил. Все та же ошибка.



перед загрузкой из потока Web->Document должен быть не равен NULL
Вариант: делать Web->Navigate(WideString("about :blank"));
но при таком подходе сложности будут с картинками (ссылками на них)

12K
30 марта 2008 года
Sholah_Weras
99 / / 04.12.2007
Все бы хорошо, но у меня возникает немного другая проблема. Рисуется символ
">"
Меня это совсем не устраивает. Порылся в документации Билдера, ничего, что могло бы "очистить окно" не нашел. Есть ли ф-ия, которая позволяет сделать такое, или какой-то подход? (для справки - я хочу вывести средствами языка HTML таблицу. Стандарные и другие компоненты не устраивают)
11
30 марта 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Sholah_Weras
Все бы хорошо, но у меня возникает немного другая проблема. Рисуется символ
">"
Меня это совсем не устраивает. Порылся в документации Билдера, ничего, что могло бы "очистить окно" не нашел. Есть ли ф-ия, которая позволяет сделать такое, или какой-то подход? (для справки - я хочу вывести средствами языка HTML таблицу. Стандарные и другие компоненты не устраивают)



Вариант1: Выучить ХТМЛ и писать на ХТМЛ, а затем загружать его в IHTMLDocument2
Вариант2: В MSDN смотреть про интерфейсы IHTMLDocument2, IHTMLTable, IHTNLTableRow и т.п. вот пример, спасибо тов. GIZMO

12K
30 марта 2008 года
Sholah_Weras
99 / / 04.12.2007
Перспектива познакомиться с новыми технологиями внушила страх (вкупе с нехваткой времени), потому был произведен поиск по коду на предмет наличия ошибок и косяков.
Кои были найдены и безжалостно удалены (я сам, вот этими вот руками выводил на экран символ ">").

Приведу пример кода, который позволяет загрузить в TCppWebBrowser текст, не используя файлы. C++ Builder. (надеюсь, теперь поиск у людей ответа на этот вопрос сработает хорошо)

Код:
TMemoryStream      *stm  = new TMemoryStream();
    TStringList        *text = new TStringList();
    IPersistStreamInit *psi;

    text->Add("<html>");
    text->Add("<body>");
    text->Add("Надо ж, работает");
    text->Add("</body>");
    text->Add("</html>");

    Web->Navigate(WideString("about :blank"));

    text->SaveToStream(stm);
    stm->Seek(0,0);

    TStreamAdapter *sa = new TStreamAdapter(stm, soReference);

    if (SUCCEEDED(Web->Document->QueryInterface(IID_IPersistStreamInit,(void **)&psi)))
        psi->Load(*sa);

    psi->Release();

    delete stm;
    delete text;


Спасибо за помощь.
12K
31 марта 2008 года
Sholah_Weras
99 / / 04.12.2007
И еще вопрос.

В text надо добавить строку HTML кода. Все бы хорошо, но данная строка не может содержать имена переменных (а в этом-то и суть всего сыр-бора). Т.е. нельзя записать что-то вроде:

text->Add("Надо ж, работает" + some_var1 + "еще что-то" + some_var2);
(много разных строк, много разных переменых)
Как можно реализовать такую возможность? Очень надо!
11
01 апреля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Sholah_Weras
И еще вопрос.

В text надо добавить строку HTML кода. Все бы хорошо, но данная строка не может содержать имена переменных (а в этом-то и суть всего сыр-бора). Т.е. нельзя записать что-то вроде:

text->Add("Надо ж, работает" + some_var1 + "еще что-то" + some_var2);
(много разных строк, много разных переменых)
Как можно реализовать такую возможность? Очень надо!



не совсем понятно что же в итоге должно получиться...
если этот текст должен отобразится в браузере то смотри в МСДН IHTMLElement
и что за переменные?

12K
01 апреля 2008 года
Sholah_Weras
99 / / 04.12.2007
Хорошо, конкретный пример (наверное ,с него и надо было начинать).

Обычная HTML строка:
text->Add("<td height='35' width='50' bgcolor='#FFCC33'> <center> 1x1 </center> </td>");

А теперь надо сделать так, чтобы вместо цифр 35 и 40 стояли переменные:
int row_height, row_width;
И вместо текста 1x1 стояла какая-то переменная:
string some;

Т.е. в итоге я генерирую HTML код.
11
01 апреля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Sholah_Weras
Хорошо, конкретный пример (наверное ,с него и надо было начинать).

Обычная HTML строка:
text->Add("<td height='35' width='50' bgcolor='#FFCC33'> <center> 1x1 </center> </td>");

А теперь надо сделать так, чтобы вместо цифр 35 и 40 стояли переменные:
int row_height, row_width;
И вместо текста 1x1 стояла какая-то переменная:
string some;

Т.е. в итоге я генерирую HTML код.



это все есть в IHTMLTable, IHTMLTableCell, IHTMLTableCol, IHTMLTableRow, IHTMLElement и в том примере от GIZMO

PS: можно генерить и вот так: WideString html = "<td height=" + row_height + "width="+row_width +" bgcolor='#FFCC33'> <center>"+some+"</center> </td>";

12K
01 апреля 2008 года
Sholah_Weras
99 / / 04.12.2007
Не, вариант с WideString не прокатывает - компилятор ставит курсор после первого "row_height +" и говорит, что Invalid pointer addition

Похоже, все-таки придется посмотреть эти компоненты
11
01 апреля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Sholah_Weras
Не, вариант с WideString не прокатывает - компилятор ставит курсор после первого "row_height +" и говорит, что Invalid pointer addition

Похоже, все-таки придется посмотреть эти компоненты


 
Код:
WideString html = "<td height=" + WideString(row_height) + "width="+WideString(row_width) +" bgcolor='#FFCC33'> <center>"+some+"</center> </td>";
12K
01 апреля 2008 года
Sholah_Weras
99 / / 04.12.2007
Отлично!
Вот эта штука WideString() работает и с TStringList.

Спасибо за помощь!
12K
04 апреля 2008 года
Sholah_Weras
99 / / 04.12.2007
И снова вопрос есть:

Надо в
list<String> some
загрузить содержимое строк полей базы данных.
Могу получить доступ к этим строкам используя DBGrid, но совсем мне этого не надо.
Как получить доступ к этим строкам, минуя DBGrid, напрямую, через ADOTable (или как-то еще)?

Заранее благодарен
9.4K
04 апреля 2008 года
AIGrifon
165 / / 13.11.2007
У ADOTable есть свойство Fields. У него можно использовать Fields[номер поля], либо FieldByName(имя поля). Для перехода к первой строке используй First, переход на следующую - Next.
12K
05 апреля 2008 года
Sholah_Weras
99 / / 04.12.2007
Ага, спасибо, работает.
А как можно получить количество этих строк (конкретного поля)?
9.4K
05 апреля 2008 года
AIGrifon
165 / / 13.11.2007
Количество строк в ADOTable можно получить с помощью свойства RecordCount.
12K
05 апреля 2008 года
Sholah_Weras
99 / / 04.12.2007
Таким образом:

int n = ADO_TABLE->RecordCount;

Возвращается максимальное колчество строк в каком-нибудь столбце, а не кол-во строк в данном.
9.4K
05 апреля 2008 года
AIGrifon
165 / / 13.11.2007
Цитата: Sholah_Weras

Возвращается максимальное колчество строк в каком-нибудь столбце, а не кол-во строк в данном.



Количество строк в любом столбце таблицы совпадает с количеством строк в самой таблице. Если имелось в виду получение количества не пустых строк в столбце, то можно воспользоваться фильтрацией (свойства Filter и Filtered) для столбца, а затем получить количество строк в таблице. Либо использовать для этих целей SQL-запрос.

12K
05 апреля 2008 года
Sholah_Weras
99 / / 04.12.2007
Поискал в нете, почитал документацию - как правильно использовать Filter/Filtered атк и не понял. Да и с SQL запросом проблемы.
Можно небольшое пример?

P.S. Я понимаю, что мой вопрос из разряда "глупее не придумаешь", но я действительно не смог найти ответа. А он очень нужен.
9.4K
07 апреля 2008 года
AIGrifon
165 / / 13.11.2007
Цитата: Sholah_Weras
Поискал в нете, почитал документацию - как правильно использовать Filter/Filtered атк и не понял. Да и с SQL запросом проблемы.
Можно небольшое пример?

P.S. Я понимаю, что мой вопрос из разряда "глупее не придумаешь", но я действительно не смог найти ответа. А он очень нужен.



По фильтрам:
Свойство Filtered разрешает/запрещает фильтрацию (true/аalse).
Свойство фильтр имеет формат (строка):

<Поле> <оператор сравнения> <'Значение'>.

Значение обязатьльно заключать в кавычки. Для того, чтобы не путаться с ними есть функция QuotedStr, которая ззанимается этим.

Допустим нужно отфильтровать записи с полем Фамилия соответствующим Иванов. Тогда в фильтр пишем строку:
'Фамилия=' + QuotedStr('Иванов').

Если значение поля содержит несколько фрагментов (слов, например), его берем в квадратные скобки: [город Москва].

Помимо равенства можно использовать также >, < и т. д.

Также в фильтр можно записывать несколько условий. Например, отфильтруем строки с полем Число лежащим в пределах от 1 до 10.

'Число>=' + QuotedStr('1') + 'and Число <=' + QuotedStr('10')

По основам SQL можешь почитать статью Фленова: Язык запросов SQL. В pdf где-то 0,5 М весит. Там все описано как раз для новичков - просто и понятно.

12K
07 апреля 2008 года
Sholah_Weras
99 / / 04.12.2007
Пишу так:
 
Код:
String name = "какое-то значение";

ADOTable->Filter   = name + '=' + QuotedStr(' ');
ADOTable->Filtered = true;


Ругается, что аргументы имеют неверный тип, выходят за пределы и вообще все плохо.

Где я накосячил (напомню, что надо скрыть все пустые строки столбца, и посчитать кол-во непустые)?
246
07 апреля 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: Sholah_Weras
Пишу так:
 
Код:
String name = "какое-то значение";

ADOTable->Filter   = name + '=' + QuotedStr(' ');
ADOTable->Filtered = true;


Ругается, что аргументы имеют неверный тип, выходят за пределы и вообще все плохо.

Где я накосячил (напомню, что надо скрыть все пустые строки столбца, и посчитать кол-во непустые)?



http://forum.codenet.ru/showthread.php?t=43058&highlight=Filter

пользуйся поиском и справкой для начала...

12K
07 апреля 2008 года
Sholah_Weras
99 / / 04.12.2007
Цитата: GIZMO
http://forum.codenet.ru/showthread.php?t=43058&highlight=Filter

пользуйся поиском и справкой для начала...



Прочитал. Перечитал. Соответственно, сделал и переделал. Все та же ошибка.
Начнем с начала. Как должна выглядеть строка, которая отфильтрует пустые строки?

 
Код:
Так:
Some_field = ''

Вот так:
Some_field = ' '

Или так:
Some_field = 'NULL'


Или как-то по другому?
12K
08 апреля 2008 года
Sholah_Weras
99 / / 04.12.2007
Товарищи, не поверите, но очень надо - из-за невозможности загрузить данные из БД в члены класса стоит вся работа.

Нужна помощь, очень нужна.
246
08 апреля 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: Sholah_Weras
Прочитал. Перечитал. Соответственно, сделал и переделал. Все та же ошибка.
Начнем с начала. Как должна выглядеть строка, которая отфильтрует пустые строки?

 
Код:
Так:
Some_field = ''

Вот так:
Some_field = ' '

Или так:
Some_field = 'NULL'


Или как-то по другому?


ну написаноЖ в справке черным по английски Some_field = NULL

6.0K
11 апреля 2008 года
Tramp
71 / / 25.07.2006
Помогите разобраться, идея взята у Делфийцев ;)
Код:
void __fastcall TMain::StringGridDrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
 int acol;
 int arow;
 char buf[128];
 if ([COLOR="Red"]State == gdFixed[/COLOR]) Abort(); // ошибка вот здесь
 StringGrid->Canvas->Font = Font;
 StringGrid->Canvas->Font->Color = clWindowText;
 StringGrid->Canvas->Brush->Color = clWindow;
 StringGrid->Canvas->FillRect(Rect);
 StrPCopy(buf, StringGrid->Cells[acol][arow]);
 // и ниже:
 DrawText(StringGrid->Canvas->Handle, buf, -1, [COLOR="Red"]Rect[/COLOR], DT_SINGLELINE || DT_VCENTER || DT_NOCLIP || DT_LEFT);
}
11
11 апреля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Tramp
Помогите разобраться, идея взята у Делфийцев ;)
Код:
void __fastcall TMain::StringGridDrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
 int acol;
 int arow;
 char buf[128];
 if ([COLOR="Red"]State == gdFixed[/COLOR]) Abort(); // ошибка вот здесь
 StringGrid->Canvas->Font = Font;
 StringGrid->Canvas->Font->Color = clWindowText;
 StringGrid->Canvas->Brush->Color = clWindow;
 StringGrid->Canvas->FillRect(Rect);
 StrPCopy(buf, StringGrid->Cells[acol][arow]);
 // и ниже:
 DrawText(StringGrid->Canvas->Handle, buf, -1, [COLOR="Red"]Rect[/COLOR], DT_SINGLELINE || DT_VCENTER || DT_NOCLIP || DT_LEFT);
}



а ф чом вопрос то? прога работает? если да, то ниче не трогай

6.0K
11 апреля 2008 года
Tramp
71 / / 25.07.2006
Цитата:
а ф чом вопрос то? прога работает? если да, то ниче не трогай



ошибки я выделил красным... если бы всё работало я бы не спрашивал. :)

11
11 апреля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Tramp
ошибки я выделил красным... если бы всё работало я бы не спрашивал. :)



 
Код:
DrawText(StringGrid->Canvas->Handle, buf, -1, &Rect, DT_SINGLELINE || DT_VCENTER || DT_NOCLIP || DT_LEFT);

по поводу 1-го хз...
246
11 апреля 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: oxotnik333
 
Код:
DrawText(StringGrid->Canvas->Handle, buf, -1, &Rect, DT_SINGLELINE || DT_VCENTER || DT_NOCLIP || DT_LEFT);

по поводу 1-го хз...


Тут все просто:
TGridDrawState это набор - Set, т.е. будет
if(State.Contains(gdFixed))

6.0K
11 апреля 2008 года
Tramp
71 / / 25.07.2006
oxotnik333, GIZMO спасибо!
но у меня следующая проблема, мой StringGrid загружается динамически.
И надписи в таблице не прорисовыаются.
11
11 апреля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Tramp
oxotnik333, GIZMO спасибо!
но у меня следующая проблема, мой StringGrid загружается динамически.
И надписи в таблице не прорисовыаются.



код покажь!

6.0K
14 апреля 2008 года
Tramp
71 / / 25.07.2006
Для очистки StringGrid'а я написал следующую функцию:
 
Код:
void __fastcall TMain::UserClear()
{
    for (int n = 0; n<=UserGrid->RowCount; n++)
    {
         UserGrid->Cells[1][n] = "";
         UserGrid->Cells[2][n] = "";
    }
    UserGrid->RowCount = 2;
    UserGrid->FixedRows = 1;
}


Заполняю я таблицу следующим образом:

Код:
int col = 1;
 ADOQuery->Close();
 ADOQuery->SQL->Clear();
 ADOQuery->SQL->Add("...");
 ADOQuery->SQL->Add("...");
  try
  {
    ADOQuery->Open();
    while (!ADOQuery->Eof)
    {
     UserGrid->Cells[1][col] = ADOQuery->FieldByName("...")->AsInteger;
     UserGrid->Cells[2][col] = Trim(ADOQuery->FieldByName("...")->AsString);
     UserGrid->RowCount++;
     col++;
     ADOQuery->Next();
    }
  }
  catch(...)
  {
   MessageDlg("Ошибка!", mtError, TMsgDlgButtons() << mbOK, 0);
   ...
  }
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог