marconi |
Отправлено: 29.02.2004, 09:24 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 86
|
Попробовал применить :
DWORD writed;
WriteFile(hFile,x,sizeof(x),&writed,0);
WriteFile(hFile,y,sizeof(y),&writed,0);
WriteFile(hFile,cen,sizeof(cen),&writed,0);
но при компиляции почему то все зависло .Я прменил:
ih = FileCreate(SaveDialog1->FileName);
FileWrite(ih,(char*)&x,sizeof(x));
FileWrite(ih,(char*)&y,sizeof(y));
FileWrite(ih,(char*)&cen,sizeof(cen));
FileClose(ih);
сейчас все работает. Но я хотел спросить о другом. Я сделал
небольшую программку, там в окне StringGrid где складываются и умножаются числа.Вы конечно будете смеятся но я только месяц как изучаю Си поэтому у меня там такой код описан 30 раз
Col[0]=StrToIntDef(StringGrid1->Cells[3][1],0);
Col[1]=StrToIntDef(StringGrid1->Cells[3][2],0); и т д
и 30 раз такой:
StringGrid1->Cells[5][1]= FloatToStrF(x[0],ffFixed,10,2);
StringGrid1->Cells[5][2]= FloatToStrF(x[1],ffFixed,10,2); и т.д
Кроме того к StringGrid еще прибавляются другие данные которые вводятся не в таблицу.
Но тем неменее все работае считает. Сейчас осталось только все распечатать.
Я тут на форуме читал что примерно год назад вы обсуждали печать из StringGrid через F1Book, или лучше применить что другое.
Как прще всего это сделать, только не применяя Excel.
|
|
Георгий |
Отправлено: 29.02.2004, 13:42 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
да, помню эту печать...
тогда я на принтер посылал StringGrid:
CODE | Printer()->Orientation=poLandscape;
Printer()->BeginDoc();
this->StringGrid1->PaintTo(Printer()->Handle,10,10);
Printer()->EndDoc();
|
выглядело это очень коряво и поменял это на
CODE | TPrinter* Prntr = Printer();
Prntr->Orientation=poLandscape;
this->RichEdit1->Print("отчёт за 12 часов работы"); |
т.е. в RichEdit`е выбирал шрифт с одинаковой шириной символов, сваливал туда таблицу, расставляя пробелы как разделители.
но и этот метод был плох — при печати больших отчётов (например за 24 часа) он на один лист не вписывался и некрасиво печатался.
тогда я на этом и остановился, тем более что заказчик не хотел печатью пользоваться вообще, но тогда я не знал о компоненте FastReport. С его помощью легко делать печать таблиц, советую, пока есть время, разобраться с этим компонентом, тем более, что стоит он очень мало — если память не изменяет, то около 20$.
мои тогдашние наброски с использованием FastReport положил http://georgiestar.pisem.net/fastreport_test.rar
(не забудь установить двоичный режим закачки, а то по умолчанию он как текст любит качаться с заменой 0x00 на 0x20)
|
|
Георгий |
Отправлено: 29.02.2004, 13:53 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
нет, это я как то не так заливаю...
|
|
marconi |
Отправлено: 29.02.2004, 14:54 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 86
|
Я читал в архиве форума многие ссылаются на FastReport , но пока даже незнаю что это . Ладно поищу сейчас. Спасибо.
|
|
marconi |
Отправлено: 29.02.2004, 15:03 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 86
|
Вторая ссылка не работает.
что-то скачиваю по первой http://georgiestar.pisem.net/fastreport_test.rar
|
|
Георгий |
Отправлено: 29.02.2004, 15:37 |
|
Почетный железнодорожник
Группа: Модератор
Сообщений: 874
|
http://www.fastreport.ru/ru/index.php |
|
marconi |
Отправлено: 29.02.2004, 22:18 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 86
|
Спасибо.
|
|
Asher |
Отправлено: 01.03.2004, 10:11 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
QUOTE | я только месяц как изучаю Си поэтому у меня там такой код описан 30 раз
Col[0]=StrToIntDef(StringGrid1->Cells[3][1],0);
Col[1]=StrToIntDef(StringGrid1->Cells[3][2],0); и т д
и 30 раз такой:
StringGrid1->Cells[5][1]= FloatToStrF(x[0],ffFixed,10,2);
StringGrid1->Cells[5][2]= FloatToStrF(x[1],ffFixed,10,2); и т.д |
Циклы тебе помогут.
В твоем случае
for (int i1 = 1; i1 < StringGrid1->RowCount; i1++)
Col[i1 — 1]=StrToIntDef(StringGrid1->Cells[3][i1],0);
Аналогично поступишь с (можно так)
for (int i1 = 1, i2 = 0; i1 < StringGrid1->RowCount ; i1++, i2++)
StringGrid1->Cells[5][i1]= FloatToStrF(x[i2],ffFixed,10,2);
Постарайся выровнять индексы для строк и массивов x и Col? в смысле если в таблице строку 0 не используешь — типа заголовок там разный, то просто не пользуйся 0-м индексом для этих массивов, а сами массивы увеличь на один элемент. Это что-бы прога каждый раз не считала i1 -1 или не заводить второй счетчик
|
|
marconi |
Отправлено: 01.03.2004, 16:39 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 86
|
Спасибо за разъяснение.Правда я тут воскресенье посидел и уменя получилось так, даже не пришлось выравнтвать ячейки:
int j;
for (j=0;j<32;j++)Col[j]=StrToIntDef(StringGrid1->Cells[3][1+j],0);
//-----------------------------------------------------------------------------
int I;
for (I=0;I<32;I++)Cen[I]=StrToFloatDef(StringGrid1->Cells[4][1+I],0);
Отредактировано marconi — 01/03/2004, 18:28
|
|
marconi |
Отправлено: 01.03.2004, 16:49 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 86
|
Все данные из StringGrid точнее переменные я сохраняю в двоичном виде в файле на диске, а как сохранить строки например" наименование" которыые вводятся в ячейки с клавиатуры, в виде
char[] но тогда их сначала надо из AnsiString преобразовать ?
Или я опять на асфальте в лыжи обутый?
|
|
Asher |
Отправлено: 01.03.2004, 17:12 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Выдержка из справки
QUOTE |
AnsiString::c_str() returns a non const temporary pointer to the internal string buffer in the AnsiString object. The pointer is invalid once the statement in which it is used has finished executing. That is,don't do something like this:
char* cp = Edit1->Text.c_str();
char* cp2 = strtok( cp, " \t\n" ); // cp may no longer be valid
If you need a persistent pointer, you MUST copy the string into its own buffer:
char* cp = new char[ Edit1->Text.Length() + 1 ];
strcpy( cp, Edit1->Text.c_str() );
|
|
|
marconi |
Отправлено: 01.03.2004, 17:29 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 86
|
Но это относится и к StringGrid ? В смысле чтения из его ячеек?
|
|
Asher |
Отправлено: 02.03.2004, 09:58 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Здравствуйте.
По всем интересующим вопросам смотрим в справку.
Там видим
__property AnsiString Text = {read=GetText, write=SetText};
и
__property AnsiString Cells[int ACol][int ARow] = {read=GetCells, write=SetCells};
Тип свойства идентичен.
P.S. .c_str() метод AnsiString.
P.P.S. по жизненному опыту — второй вариан, т.е. CODE | char* cp = new char[ Edit1->Text.Length() + 1 ];
strcpy( cp, Edit1->Text.c_str() ); |
надежнее.
Отредактировано Asher — 02/03/2004, 12:03
|
|
marconi |
Отправлено: 02.03.2004, 22:17 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 86
|
Спасибо еще раз. Просто я еще неумею пользоватся справкой.
Вот искал в Helpe StringGrid, вводил это имя в окна поиска в Helpe итак не нашел ни одного примера.
|
|
Asher |
Отправлено: 03.03.2004, 09:02 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Здравствуйте.
QUOTE | Вот искал в Helpe StringGrid, вводил это имя в окна поиска в Helpe итак не нашел ни одного примера. |
Выбираете мышью интересующий компонент и жмете F1. А дальше выбираете что интересует — properties, methods, events. Примеры даются по конкретным разделам.
Например
выбираем StringGrid->F1->попадаем в раздел StringGrid->Выбираем Properties->выбираем Cells->видим описание свойства->выбираем Example->видим пример перебора ячеек в цикле (что вам ранее требовалось...) ну и далее в таком духе.
P.S. Builder нормальный? в смысле со справкой? а то многие жалуются 6-ой на однодисковый — там вроде справку порубили.
|
|
Gedeon |
Отправлено: 03.03.2004, 09:51 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Я конечно не настаиваю, но на мой взгляд намного удобнее использовать TAdvStringGrid там есть такие методы как SaveToFile() и LoadFromFile() с помощью этого полностью сохраняется все в таблице от текста до размеров с выравниванием.
Хотя если
QUOTE | я только месяц как изучаю Си |
То есть смысл потренироваться и так.
|
|
marconi |
Отправлено: 03.03.2004, 16:41 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 86
|
Я так пробовал справку вызывать,но у меня появляется окно с надписью
Раздел не существует и отправляют....Правда самих файлов справки
в папке Help много.
|
|