Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» FAQ по Borland C++ Builder

Автор: IgorXI
Дата сообщения: 14.08.2008 03:29
Подскажите, как можно перекрыть метод VisibleChanging() у TCustomForm в классе-наследнике, при попытке перекрыть пишет ошибку
[C++ Error] From_CustomMDIChild.h(56): E2113 Virtual function '_fastcall TCustomMDIChild::VisibleChanging()' conflicts with base class 'TCustomForm'
Автор: Tantos
Дата сообщения: 14.08.2008 04:53
Varyag_Nord

Код:
//...
Ini->WriteString("Edits","Edit1",Form7->Edit1->Text);
Ini->UpdateFile();
delete ini;
Автор: IgorXI
Дата сообщения: 19.08.2008 10:04
У меня вопрос, можно ли создать экземпляр формы по имени класса, которое хранится в строке, с передачей параметра Owner?
Автор: spike
Дата сообщения: 05.09.2008 10:37
как связать С++ Builder с Visual SourceSafe ?
Автор: kot3
Дата сообщения: 07.10.2008 16:50
Это у меня глюк или бага в RAD2009?

String s = String("что угодно здесь");
// понятно что по умолчанию String == UnicodeString, он так и создается в отладчике это хорошо видно
printf("%s", s.c_str());
// все вроде бы хорошо строка преобразовалась в char* и напечаталась правильно.

Так вот если посмотреть на на содержимое строки s (например в отладчике или просто начать с ней работать как с UnicodeString, то обнаруживаем, что внутренний буфер тоже преобразован в char*, хотя его содержимое интерпретируется как UnicodeString. Со всеми вытекающими отсюда последствиями.
Кстати, в справке тоже тут ошибка UnicodeString::c_str() по ней возвращает тип wchar_t*, а реально возвращает char*.

Кто что может сказать?
Автор: Garrett
Дата сообщения: 08.10.2008 07:06
kot3
wchar_t* возвращает метод w_str()

Я не знаю с какого бодуна они так сделали, но это неправильно, т.к. при переходе на юникодность в RS2009 надо просматривать весь код и править c_str() в w_str().

Добавлено:
spike
Есть хороший адд-он VssConneXion. Живёт здесь - http://www.epocalipse.com/index.htm
Но я бы посоветовал поставить TortoiseSVN. Будет тебе счастье независимое ни от какой среды.
Автор: kot3
Дата сообщения: 08.10.2008 17:46
Garrett
Мне одно непонятно зачем при этом буфер строки то портится?
Автор: Garrett
Дата сообщения: 09.10.2008 07:31
kot3
У меня работает всё нормально, для анг, рус и азерб. языков.
И я использую конкретно UnicodeString или wstring.
Автор: portolomeo
Дата сообщения: 10.10.2008 14:44
Добрый день, объясните, пожалуйста -

заранее скажу что в С++ опыта практически нет.
Так вот, сейчас работаю над одной программой для автоматизации одного процесса, основная суть которой преобразование данных.

При этом исходные данные содержатся в текстовом файле в таком формате:
1 6.100E-0003 5.515E+0002 4.574E+0000 2.785E+0001 6.191E-0003 6.315E+0003
2 8.700E-0003 5.479E+0002 4.546E+0000 2.853E+0001 7.393E-0003 3.510E+0003
3 1.010E-0002 5.459E+0002 4.567E+0000 2.847E+0001 7.966E-0003 2.744E+0003
...
Здесь - 7 упорядоченных столбцов.
Преобразовать эти данные как надо я наверное смогу, а вот как прийти к этому этапу?

Т.е. сейчас есть (создана) специальная форма (аналог ноутпад), которая открывает текстовый файл. А как научить прогу:
а) работать с открытым файлом, т.е. обращаться к ней,
б) как выделять нужные мне отрезки строк для дальнейшего преобразования?

суть - эти 5.459E+0002 преобразовать в целые числа, здесь это = 545.
помогите, плз...
Автор: akaGM
Дата сообщения: 10.10.2008 15:27
portolomeo
формат файла всегда одинаков?
количество строк наперёд известно?

Цитата:
б) как выделять нужные мне отрезки строк для дальнейшего преобразования?

т.е. читать любую строку в файле по выбору?

может тебе хватит возможности прочитать весь файл целиком в массив?

чем больше информации о проблеме, тем вероятнее помощь...
Автор: portolomeo
Дата сообщения: 10.10.2008 15:49
akaGM
формат файла всегда одинаков, количество строк всегда по разному - в диапазоне 50-70.

как я написал выше - суть - это преобразование выражении *.***Е+000* в целые числа, здесь - по принципу - последняя звездочка (*) после 000 - это показатель десятичности начальной части выражения, т.е. *.*** (например, 2.847E+0001 = это 28, а там где минус 2.847E-0001 = это 0,2).

При этом преобразовать нужно не все выражения, а лишь расположенные в 3, 4 и 6 столбцах (если не учитывать столбец порядковых номеров строк) - вот что я имел ввиду под

Цитата:
б) как выделять нужные мне отрезки строк для дальнейшего преобразования?



Цитата:
может тебе хватит возможности прочитать весь файл целиком в массив?


я тоже думаю что лучше через массив - получается это 3-хмерная матрица?
Автор: akaGM
Дата сообщения: 10.10.2008 16:56
portolomeo

Цитата:
это преобразование в целые числа, (например, 2.847E-0001 = это 0,2)

это как?
Автор: portolomeo
Дата сообщения: 10.10.2008 17:52
akaGM

т.е. 2.847E-0001 - это значение одного параметра, весь файл состоит из выражении такого вида.
задача - представить эти выражения в "человеческом" виде, по формуле:
число после 3-х нулей - здесь это 1 - это показатель десятичности первой части выражения 2.847 - т.е. нужно умножить (если +) или разделить (если -) на 10.
Если после нулей стоит 2 - значит нужно умножить (если +) или разделить (если -) на 100.
Пример:

2.847E-0001 = 0,2
2.847E-0002 = 0,02
2.847E+0001 = 28
2.847E+0001 = 284

т.е. три нуля там есть всегда, и обычно после нулей либо 1, либо 2, либо 3.
и в основном +.

мне представляется, что программа читает файл, выбирает нужные отрезки строк (наши выражения) - записывает их в 3-хмерный (наверное) массив.
Затем к элементам этого массива применяется указанная процедура и новые значения записываются в новый массив...
Автор: akaGM
Дата сообщения: 10.10.2008 17:57
portolomeo
блин...

Цитата:
2.847E-0001 = 0,2

какое на хрен 0.2 _целое число_?!

на, разбирайся, работай с массивами a[] и ia[]


Код: #include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define DATAFILE "file.dat"
#define MAX_NUM 70

void main(void) {
int n, i;
long double a1[MAX_NUM], a2[MAX_NUM], a3[MAX_NUM], a4[MAX_NUM], a5[MAX_NUM], a6[MAX_NUM];
int num[MAX_NUM];
int ia3[MAX_NUM], ia4[MAX_NUM], ia6[MAX_NUM];
FILE *fp;

fp = fopen(DATAFILE, "r");
i = 0;
while (!feof(fp)) {
fscanf(fp, "%d %lE %lE %lE %lE %lE %lE\n", &num[i], &a1[i], &a2[i], &a3[i], &a4[i], &a5[i], &a6[i]);
i++;
}
n = i;
printf("num = %d\n", n);
fclose(fp);

// long double --> int conversion
for (i = 0; i < n; i++) {
ia3[i] = (int)floorl(a3[i]);
ia4[i] = (int)floorl(a4[i]);
ia6[i] = (int)floorl(a6[i]);

printf("#%d %d %d %d\n", num[i], ia3[i], ia4[i], ia6[i]);
}
}
Автор: portolomeo2
Дата сообщения: 10.10.2008 18:38
akaGM
sory, ясно что это не целое, пишу целое т.к. в основном выражения из (+)-ов и соотв. идет умножение.
спасибо!, ща покопаюсь.
Автор: VerZer
Дата сообщения: 12.10.2008 14:48
не изобретайте велосипед, в VCL есть готовые средства перевода строковый представлений в число: StrToFloat(..), String::ToDouble()

примерная обработка представленного выше формата:

Код: //---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TStringList *sl = new TStringList;

    sl->Delimiter = ' ';
    sl->DelimitedText = Memo1->Text;

    Memo1->Lines->Add("--------------------------------------");

    DecimalSeparator = '.';

double d;

    for (int i = 0; i < sl->Count; i++)
    {
        d = sl->Strings[i].ToDouble();

        Memo1->Lines->Add(d);
    }

    delete sl;
}
//---------------------------------------------------------------------------
Автор: vadfromnu
Дата сообщения: 28.10.2008 05:53
Мне нужна функция, которая меняет порядок байт в целочисленной 4 байтовой переменной. Т.е. нужно чтобы следующий код работал:
int __fastcall InvertByteOrder(int val)
{
asm
    {
    bswap eax
    ret
    }
}
Однако билдер приписывает в начало функции:
push ebp
mov ebp,esp
push ecx
mov [ebp-$04],eax
Можно ли как-нибудь сказать билдеру, что функция полностью пишется мною и от него ничего приписывать не требуется.
Автор: 64bit
Дата сообщения: 28.10.2008 10:14
int __declspec(naked) InvertByteOrder(int val) // без __fastcall
{
...
}

Неплохой пример
Автор: kot3
Дата сообщения: 07.11.2008 13:48
Интересно, это у меня только такой глюк наблюдается:

Среда: RAD 2009 OS: Vista Ultimate x64

Проблема: не получается програмно выгрузить ранее динамически загруженную DLL если запускать программу из IDE. При запуске не из под IDE все работает.
Есть подозрения что аналогичная проблема будет и под Vista x86.
А вот под XP x86 похоже будет работать.

Даже такой простой код не хочет работать:
//---------------------------------------------------------------------------
#pragma hdrstop
#include <tchar.h>
#include <Windows.h>
#include <stdio.h>
//---------------------------------------------------------------------------
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
HMODULE hDll;
const char nameDll[] = "testDll.dll";

hDll = NULL;
hDll = LoadLibrary(nameDll);
if(hDll) {
Sleep(3000);
printf("FreeLibrary() ...");
if(FreeLibrary(hDll)) printf("... OK."); else printf("... fail");
}
printf("end of test.");
system("pause");
return 0;
}
//---------------------------------------------------------------------------

Имя DLL можно указать любое, главное чтобы в той же папке где и exe лежала.
У кого какие мысли?
Ладно бы если бы FreeLibrary(...) вернула ошибку, а то просто виснет в ней намертво и усе!!!
Автор: Vaital3000
Дата сообщения: 07.11.2008 23:04
Здравствуйте люди.
Короче к делу.
Как мне получить двоичное значение реестра,Reg->ReadBinaryData не помогает,там походу некуда буфер писать.
Впринципи я уже над той прогой не работаю,так что твет не обязателен.

А теперь те вопросы,которые мне нужны:
1.Как сделать возможнось приложению уходить в трей,и работать в фоне???
2.У меня приложение,которое должно запускать программы в нужное время,GetSystemTime даёт мне время,спомощью if я выставляю нужные минуты и часы,при таком расскладе нужное приложение начинает запускаться много раз,пока не повисает окончательно,в timer время равно 1.Если в if ставлю секунды и минуты в 0,то не запускаеться вообще,если в timer ставлю 600,секунды и мили не прописываю,то тоже не запускаеться,кое как настраивал,но оч нестабильно получалось,подскажите решение.
3.Ну это тупой простой вопрос,но сам чё то найти не могу,как убивать процессы,имея только имя.И как получить его из диалога выбора файлов???
4.Ну и на засыпку как сделать возможность запуска и отключения подключения к интернету???
Автор: ne0_2002
Дата сообщения: 17.11.2008 22:06
kot3
А как либа DLL_PROCESS_DETACH обрабатывает?
Автор: kot3
Дата сообщения: 18.11.2008 16:54
ne0_2002

Цитата:
А как либа DLL_PROCESS_DETACH обрабатывает?


Код:
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{

...

switch(reason) {
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return true;
Автор: ne0_2002
Дата сообщения: 18.11.2008 21:49
kot3
А что на месте "..."? Смысл вопроса в том, что виснуть может не сам вызов FreeLibrary, а обработка сигнала выгрузки внутри самой DLL... Хотя если вне IDE работает...
Автор: kot3
Дата сообщения: 19.11.2008 07:52
ne0_2002
Да нет там ничего особенного, более того даже такую dll выгрузить не получается

Код: int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
Автор: VV189
Дата сообщения: 21.11.2008 22:29
DELETED....
Автор: amfius
Дата сообщения: 03.12.2008 20:35
Извините за детский вопрос, но тем не менее. Только начинаю программировать в C++ Builder 2009 (до этого писал в Eclipse CDT+Cygwin). Все обыскал (наверное невнимательно смотрел). Нужно подключить дополнительную библиотеку. Опцию library path нашел - это путь к подключаемой библиотеке. А где указывать имя самой подключаемой библиотеки?
Автор: vndovr
Дата сообщения: 05.12.2008 00:59
Project->Add to project и указать имя файла
Автор: amfius
Дата сообщения: 08.12.2008 20:23
Спасибо за совет. Но еще хотел уточнить следующее. Нужные мне библиотеки идут в формате microsoft и при попытке их подключения выводится предупреждение, что библиотеки не в OMF формате (возможно COFF). В связи с этим мне нужно сгенерировать новые библиотеки импорта (*.lib) на базе *.dll и/или *.def файлов.
Если указать и def и dll-файлы (implib.exe glib-2.0.lib glib-2.0.def libglib-2.0-0.dll), то выводится предупреждение "Warning: duplicate symbol ...", но библиотека ганарится. Если указать просто dll (implib.exe glib-2.0.lib libglib-2.0-0.dll), то библиотека тоже генерится, но чуть меньшего размера. А если включить режим совместимости с библиотеками microsoft, то результирующий размер будет в 2 раза больше. Есть и еще непонятная мне опция -f (forces imports by name).
Подскажите: с какими опциями лучше запускать implib.exe? Или предпочтительней пользоваться coff2omf.exe для конвертации?
Автор: portolomeo
Дата сообщения: 09.12.2008 01:28
добрый день, подскажите пож-та,

в данный момент пишу на Билдере С++ прогу по обаботке данных, использую данные в клетках - cellstring(*,*) - хотелось бы иметь возможность оперировать этими данными как с числами - в моем случае интересует деление на 2 значении, находящихся в клетках....

ПЛЗ
Автор: Tantos
Дата сообщения: 09.12.2008 03:53
portolomeo
Не получится. Надо преобразовывать к числовому типу (StrToInt/StrToFloat), производить необходимые манипуляции и записывать в строковом виде.

Страницы: 12345678910111213141516171819202122232425262728

Предыдущая тема: ms exchange


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.