C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Вопрос Георгию, продолжение запись в файл
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



нет, это я как то не так заливаю...

User Attached Image Скачать файл
FastReport_Test.rar


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 преобразовать ?
Или я опять на асфальте в лыжи обутый?sad.gif
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



Здравствуйте.
По всем интересующим вопросам смотрим в справку. biggrin.gif
Там видим
__property AnsiString Text = {read=GetText, write=SetText};
и
__property AnsiString Cells[int ACol][int ARow] = {read=GetCells, write=SetCells};
Тип свойства идентичен. biggrin.gif biggrin.gif biggrin.gif

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 много.

Вернуться в Вопросы программирования в C++Builder