Помощь - Поиск - Пользователи - Календарь
Полная версия: Протокол аутентификации Фейге-Фиата-Шамира
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
*kitty*
Здравствуйте! Очень нужна помощь в написании небольшой программы с большими числами. smile.gif Необходимо реализовать протокол аутентификации Фейге-Фиата-Шамира, используя длинные ключи. Нашла в инете реализацию цифровой подписи на основе данного протокола с использованием библиотеки ‘lip.h’ (работа с длинными числами, модулярная арифметика), обрадовалась, увидя процедуру генерации ключей, но, начав разбираться в коде поняла, что для цифровой подписи протокол несколько иной…
В протоколе аутентификации ФФШ секретный ключ формируется следующим образом: ищутся квадратичные вычеты по модулю n (n=p*q, где p и q – большие простые числа), далее находят их обратные значения опять же по модулю n, затем из получившегося множества выбирают k значений, из каждого значения извлекается квадратный корень по модулю n – получившийся вектор из k чисел и будет секретным ключом. В цифровой же подписи секретный ключ формируется иным образом. Вот и попала я в тупиковую ситуацию: на Си/Си++ ранее писать не приходилось, работала только на Делфи, поэтому каждый шаг дается пока с трудом, а тут такая головоломка… unsure.gif Не представляю даже каким образом можно реализовать генерацию секретного ключа, а именно нахождение квадратичных вычетов по модулю для длинного числа: осуществлять это перебором? наверное, займет много времени; как хранить найденное множество значений? ведь их будет очень много…
Библиотека, на первый взгляд, приличная, все функции снабжены кратким описанием, присутсвуют все необходимые операции модулярной арифметики: умножение, вычисление обратного значения, квадратного корня и т.д. Сама понимаю, что не справлюсь, поэтому буду очень рада помощи.
Прикрепляю проект с присоединенной библиотекой, ничего не выбрасывала из кода, хотя хэш-функция мне не нужна, а для начала только процедура FFS_gen_keys. Так же выкладываю описание самого алгоритма.
Нажмите для просмотра прикрепленного файла
Lapp
Цитата(*kitty* @ 22.04.2010 14:39) *
Не представляю даже каким образом можно реализовать генерацию секретного ключа, а именно нахождение квадратичных вычетов по модулю для длинного числа: осуществлять это перебором? наверное, займет много времени; как хранить найденное множество значений? ведь их будет очень много…
Непонятен такой момент: сколько тебе нужно вычетов? То есть чему равно то число k?
Собственно поиск вычетов, мне кажется, не так уж и долог. Это не совсем перебор. Смотри.
Берем некторое x (случайно), возводим его в квадрат и находим его остаток (a) по модулю n - это и есть вычет. Так? Вроде, так. Повторяем эту операцию, отсеивая повторы (по a), пока не наберем нужное количество k. Если k не очень велико, то повторов много не будет. Вычетов же довольно много. Если бы n было простым, их было бы порядка n/2. Не знаю, как оценить в случае произведения двух простых, но вряд ли разлчичие составляет много порядков.. )) Так что особой задержки тут ожидать не следует.
Вопрос о хранении тоже сопряжен с их количеством. Чем определяется k?

Ааа.. Ясно: k напрямую связана с криптостойкостью (я все-таки дочитал тот док до конца)). Так что ты выбираешь k, исходя из желаемой прочности. Если устраивает, скажем, 128 бит (при однократной попытке), то k=128. Я прав? smile.gif

Добавлено через 6 мин.
Еще одна маленькая неясность: из какого диапазона выбирать случайное x? По идее, оно может (и, наверное, должно) быть больше n. Если брать маленькие (порядка n), то, боюсь, это перекособочит весь алгоритм и понизит его прочность. Не знаю, как тут быть.. Чисто интуитивно кажется, что достаточно диапазона порядка n2 smile.gif. А это в свою очередь означает, что нужно уметь обрабатывать числа аж до n4..

Реализаций длинных чисел, к слову сказать, на Форуме проскакивало несколько. Одна из них, кажется, в FAQе.. Какой конкретно диапазон тебе нужен?
*kitty*
k действительно отвечает за криптоскойкость, чем больше будет компонентов в секретном ключе, тем лучше smile.gif , выбирается, видимо, из своих собственных соображений. Длина простых чисел p и q, с которых начинается алгоритм, должна быть не меньше 256 бит (опять же, чем больше, тем лучше).
Квадратичные вычеты по модулю n, если использовать способ простого перебора, находятся следующим образом: берутся все целые числа, меньшие n, начиная с единицы, возводятся в квадрат по модулю n, получившиеся остатки и есть искомые квадратичные вычеты. Они могут повторятся. Различных значений должно быть ровно (p-1)*(q-1)/4. Но есть одно существенное "НО": для формирования секретного ключа берутся обратные значения по модулю n для квадратичных вычетов, а не для каждого числа существует обратное значение по модулю n, а именно не существует таких обратных значений для чисел, которые не являются взаимно простыми с n. Поэтому нельзя взять произвольно k целых чисел < n, возвести их в квадрат и найти остаток, так как длина ключа может получиться меньше нужной....

Добавлено через 15 мин.
Ой, сначала не так поняла идею про k blush.gif . Наверное, хорошая идея, искать не всё, а только пока не наберется k квадратичных вычетов, имеющих обратные значения по модулю n.
Lapp
*kitty*, ты хитрая лиса )), если ты все знала - зачем спрашивала? smile.gif
Цитата(*kitty* @ 23.04.2010 20:37) *
Но есть одно существенное "НО": для формирования секретного ключа берутся обратные значения по модулю n для квадратичных вычетов, а не для каждого числа существует обратное значение по модулю n, а именно не существует таких обратных значений для чисел, которые не являются взаимно простыми с n. Поэтому нельзя взять произвольно k целых чисел < n, возвести их в квадрат и найти остаток, так как длина ключа может получиться меньше нужной....
Легко быть взаимно простым с числом, являющимся произведением двух простых. Иначе говоря, НЕ взаимно простых есть только чуть больше двух )).

Цитата
хорошая идея, искать не всё, а только пока не наберется k квадратичных вычетов, имеющих обратные значения по модулю n.
На идею особо не тянет )). Никто не покупает всю картошку в мире, чтоб приготовить себе обед! smile.gif
*kitty*
Цитата
*kitty*, ты хитрая лиса )), если ты все знала - зачем спрашивала? smile.gif


Теория теорией - всегда можно взять почитать и постараться разобраться smile.gif , у меня большие проблемы с реализацией (Си не знаю, проблемы даже с обычными операторами, типа вывода, понять что написано могу, а вот что-то сотворить не получается). Тыкалась в коде как слепыш, постоянно ошибки вылетают, а я и не понимаю в чем дело unsure.gif Нужна помощь.
Цитата

Легко быть взаимно простым с числом, являющимся произведением двух простых. Иначе говоря, НЕ взаимно простых есть только чуть больше двух )).

Вот это не поняла что-то, там в примере 143=11*13, обратных значений нет у 11 чисел, так как они не являются взаимно простыми с числом 143....
Цитата

На идею особо не тянет )). Никто не покупает всю картошку в мире, чтоб приготовить себе обед! smile.gif

Точно smile.gif Ну я вот почему-то до сих пор хотела честно находить все вычеты blush.gif laugh.gif
Lapp
Цитата(*kitty* @ 24.04.2010 1:25) *
большие проблемы с реализацией (Си не знаю, проблемы даже с обычными операторами, типа вывода, понять что написано могу, а вот что-то сотворить не получается). Тыкалась в коде как слепыш, постоянно ошибки вылетают, а я и не понимаю в чем дело
Еслли ты привыкла к Паскалю - это и плюс и минус. Минус, потому что многое все же отличается (в частности, как раз простейший ввод/вывод), но ты тверже держись основных принципов - они все же одни. И как можно больше экспериментируй. И спрашивай, ессно )). Кстати, какой у тя компилятор и какая среда? И вообще, Си - это требование или ты просто так дорожишь той найденной библиотекой?

Цитата
Вот это не поняла что-то, там в примере 143=11*13, обратных значений нет у 11 чисел, так как они не являются взаимно простыми с числом 143....
И ты испугалась? lol.gif Именно это я и назвал словами "чуть больше двух". Каждое из p и q порождает свою линию "невзаимнопростыхсn" чисел: i*p и j*q. Их количество естественным образом зависит от величины p и q. Всего их p+q, грубо говоря (в примере 13+11=24). Но вычетами являются всего несколько меньше половины - вот и получили 11, что в процентном отношении от 143 довольно много. Но если мы возьмем p и q порядка 1010, то их произведение (n) будет порядка 1020, а сумма 2*1010. И процентное отношение легко превращается в микропроцентное )). Еще раз: именно это я и называю "чуть бльше двух" smile.gif. То есть вероятность того, что твой вычет не будет иметь обратного значения стремится к нулю с возрастанием размеров чисел.
Примеры - они хороши безусловно, но нужно понимать, что они не всегда прямо масштабируются.

Цитата
Точно smile.gif Ну я вот почему-то до сих пор хотела честно находить все вычеты blush.gif laugh.gif
Эээ.. так ты рискуешь умереть с голоду, так и не пообедав, восседая на картофельном Эвересте.. wacko.gif
*kitty*
Цитата(Lapp @ 24.04.2010 3:37) *
Кстати, какой у тя компилятор и какая среда? И вообще, Си - это требование или ты просто так дорожишь той найденной библиотекой?

У меня Борланд Си++ Билдер 6. Если честно, то библиотека конкретно эта понравилась: простая, охватывает основные необходимые моменты и самый большой плюс - снабжена понятными, доступными описаниями всех функций, примерами. Для Делфи подобного не нашла, если и есть библиотеки, то либо без описания, либо настолько это какими-то непонятными обрывками... Самостоятельно разбираться в библиотеках (что, где и как там делается) времени не хватает, потому что засяду с этим надолго. А к этой целая книжечка в качестве документации идет smile.gif . Вот я подумала, вдруг кто-нибудь захочет немного помочь и написать небольшой кусочек кода blush.gif
Цитата
И ты испугалась? lol.gif Именно это я и назвал словами "чуть больше двух".

Ну да, я поняла это буквально. Для меня "чуть больше двух" - это три, ну максимум четыре laugh.gif

Lapp
Цитата(*kitty* @ 24.04.2010 16:42) *
я подумала, вдруг кто-нибудь захочет немного помочь и написать небольшой кусочек кода
Гм.
Помочь хотят все, думаю. Но писать за тебя.. Может, ты начнешь? Начальных данных уже достаточно, кажется. Или еще нет?
*kitty*
Эх, если бы я могла сама написать, не обращалась бы за помощью... unsure.gif
volvo
*kitty*, понимаешь, в чем дело... Этих реализаций - полно на каждом шагу. Уж FFS найти - вообще не проблема. Поэтому и не хочется реализовывать то, что уже сделано.

Я бы на твоем месте взял готовую реализацию (если надо - прикреплю сюда PDF-файл, описывающий детали реализации, и содержащий сами исходные коды программы, правда, оно всё по-английски. И еще одно: там для работы с длинными числами используется библиотека GMP), и разобрался бы с ней. Поверь, толку будет больше, чем пытаться сделать то же самое с нуля, тыкаться туда, сюда, и ничего в итоге не продвигается... А когда разберешься - можешь уже и написать все с нуля сама, с использованием LIP.H (так сказать, для закрепления материала smile.gif )

Нужен PDF?
*kitty*
Я уже нашла этот pdf smile.gif (кстати, это единственная реализация этого протокола, который я нашла в сети, а искала долго), но там другая проблема, никак не могу подсоединить эту библиотеку, она написана под Линакс, есть сборки под ХР, но там какае-то сложности подключения все равно... вообщем не получается.
Вы не работали с этой библиотекой? Может у кого-то получилось её подключить и использовать в Билдере Си++? rolleyes.gif
volvo
Получалось... Вот тут: Sources -> gmp-lib and Builder c++ Adil рассказывал что надо делать для подключения GMP к Билдеру. Даже тестовые проекты выкладывались...
*kitty*
Спасибо, буду пробовать smile.gif
*kitty*
Написала протокол с использованием библиотеки "lip.h" в консольном режиме, работает. Теперь нужно реализовать это в визуальном режиме. Создала новый проект с формой, перенесла в папку с проектом файлы "lip.c", "lip.h", добавила в проект. В обработчике кнопки попробовала вызвать библиотечные функции, проект компилируется, но линковщик выдает ошибки по всем функциям:
[Linker Error] Unresolved external 'zrandomb(long *, long * *)' referenced from F:\FFS_VLC\MAINUNIT.OBJ
[Linker Error] Unresolved external 'zrandomprime(long, long, long * *, void (*)(long *, long * *))'
referenced from F:\FFS_VLC\MAINUNIT.OBJ
[Linker Error] Unresolved external 'zswrite(char *, long *)' referenced from F:\FFS_VLC\MAINUNIT.OBJ


Подскажите, пожалуйста, как это исправить?
volvo
#include <mem.h>
#include <stdio.h>
#include <stdlib.h>

// Указать явно, что LIP написана на чистом С:
extern "C"
{
#include "lip.h"
}
#include "MainUnit.h"


Тогда программа будет нормально линковаться. На работоспособность не проверял.
*kitty*
Спасибо, помогло smile.gif
*kitty*
Здравствуйте, по ходу реализации возникла ещё одна проблема:
из формы Form1 нажатием кнопки вызывается форма Form3->Show(). Далее, при нажатии кнопки на Form3, в Memo1 на Form1 должна выводится некоторая информация. Необходимо чтобы обе форме оставались на экране, было переключение между этими формами, то есть вызывать Form3->ShowModal() нельзя.

Подскажите, пожалуйста, как её разрешить.
volvo
Цитата
вызывать Form3->ShowModal() нельзя.
Вызывай просто Show(), не модально...
*kitty*
Цитата(volvo @ 5.05.2010 11:33) *

Вызывай просто Show(), не модально...

Так в том то и дело что выдает ошибку. Когда в обработчике кнопки Form3 пишу
Form1->Memo1->Lines->Add(AnsiString(str) + ";");

проект запускается, но когда нажимаю эту кнопку на стадии выполнения вылетает ошибкаНажмите для просмотра прикрепленного файла
volvo
Не знаю, на тестовом проекте у меня прекрасно отработало заполнение Memo, расположенного на первой форме, по нажатию кнопки на форме третьей... Присоедини свой проект, надо видеть, что и как у тебя делается...
*kitty*
Да и правда, на тестовом и у меня заработало. Значит модули как-то соединены неправильно.... но не пойму, что не так, посмотрите, пожалуйста...
volvo
Хм... smile.gif

[ILINK32 Warning] Warning: Public symbol '_zn' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\ALICEUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\TRUSTEDCENTER.OBJ
[ILINK32 Warning] Warning: Public symbol '_zw' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\ALICEUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\TRUSTEDCENTER.OBJ
[ILINK32 Warning] Warning: Public symbol '_k' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\ALICEUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\TRUSTEDCENTER.OBJ
[ILINK32 Warning] Warning: Public symbol '_t' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\ALICEUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\TRUSTEDCENTER.OBJ
[ILINK32 Warning] Warning: Public symbol '_length' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\ALICEUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\TRUSTEDCENTER.OBJ
[ILINK32 Warning] Warning: Public symbol '_zs' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\MAINUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\ALICEUNIT.OBJ
[ILINK32 Warning] Warning: Public symbol '_zs' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\MAINUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\TRUSTEDCENTER.OBJ
[ILINK32 Warning] Warning: Public symbol '_zv' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\MAINUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\ALICEUNIT.OBJ
[ILINK32 Warning] Warning: Public symbol '_zv' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\MAINUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\TRUSTEDCENTER.OBJ
[ILINK32 Warning] Warning: Public symbol '_zs' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\ALICEUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\TRUSTEDCENTER.OBJ
[ILINK32 Warning] Warning: Public symbol '_zv' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\ALICEUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\TRUSTEDCENTER.OBJ
[ILINK32 Warning] Warning: Public symbol '_Form3' defined in both
module F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\ALICEUNIT.OBJ
and F:\PROGRAMS\BDS\FFS_V2\DEBUG_BUILD\TRUSTEDCENTER.OBJ



И тебя даже ТАКИЕ предупреждения линкера не заставили задуматься, что что-то не так? Напрасно. На подобные вещи нужно всегда обращать внимание...

Теперь о том, что именно не так: А вот это:
Цитата(AliceUnit.cpp)
#include "AliceUnit.h"
#include "TrustedCenter.h"
#include "MainUnit.cpp"

, вот это:
Цитата(TrustedCenter.cpp)
#include "TrustedCenter.h"
#include "AliceUnit.cpp"



Никогда (я повторяю, никогда) не используй #include для того чтобы включить CPP-файл. Только хидер...

Итого, что надо сделать: везде, где при-include-вались CPP-файлы, заменить ".cpp" на ".h", а для того, чтобы после этого линкер мог корректно собрать проект - придется чуть-чуть пошаманить с модулем MainUnit (что-то перенести в хидер, что-то добавить в хидер)... Я сделал это, но у меня Builder 2009, ты открыть не сможешь, просто посмотри в исходниках, что и как получилось, и сделай это в своем проекте сама. smile.gif Больше так делать точно не будешь...

В идеале - пока программа содержит хоть один Warning - она не должна запускаться. Особенно - если это Warning не от компилятора.
*kitty*
Цитата
И тебя даже ТАКИЕ предупреждения линкера не заставили задуматься, что что-то не так?
Я догадывалась, что это не очень хорошо biggrin.gif , но так как не особо разбираюсь в отладке, то раз всё запускалось и работало, вычислялось правильно, то закрывала на это глаза... до поры blush.gif
Цитата
Никогда (я повторяю, никогда) не используй #include для того чтобы включить CPP-файл. Только хидер...
Хорошо, учту. Я просто хидеры вижу первый раз, в Delphi все через модули подключается.
Цитата
Я сделал это, но у меня Builder 2009, ты открыть не сможешь
Запустилось, кстати, приложение, правда с Warning'ами, но работает и в Builder 6 smile.gif

volvo, спасибо большое, что помогаешь разбираться good.gif
Lapp
Цитата(*kitty* @ 5.05.2010 23:08) *
Запустилось, кстати, приложение, правда с Warning'ами, но работает
Прекрасное подтверхдение того, что автор темы "все поняла" lol.gif

Цитата
volvo, спасибо большое, что помогаешь разбираться good.gif
Ты вполне уже вправе подтвердить свою благодарность нажатием на зеленый плюсик..
*kitty*
Цитата(Lapp @ 6.05.2010 7:38) *
Прекрасное подтверхдение того, что автор темы "все поняла"
Ну вот обязательно нужно было подколоть cool.gif Я просто отметила, что и в другой версии получилось запустить. В своей же программе исправила всё, следуя советам volvo, теперь прекрасно работает без всяких предупреждений.

Lapp
Цитата(*kitty* @ 6.05.2010 13:06) *
Ну вот обязательно нужно было подколоть
Не обижайся, это шутка smile.gif.
На самом деле я очень ценю твое отношение к делу give_rose.gif , серьезно.
+1
*kitty*
Добрый день! Возникла ещё одна проблема: как сделать так, чтобы при запуске ехе-файла на других компьютерах формы приложения не меняли свои размеры, и компоненты (а именно надписи и вставленные картинки с формулами), расположенные на них, оставались на своих местах?
(И ещё почему-то пропали установленные мною цвета у GroupBox, стали просто серыми... unsure.gif )

Вернее, не форма меняет размеры, а окно показывает только часть формы с прокруткой, а не всю форму.
volvo
Можно присоединить проект (или какую-то его часть, которая воспроизводит проблему)? И заодно уточнить, есть ли принципиальные отличия между этими разными компьютерами. Точнее - между установками ОС. Еще точнее - например, на одной машине установлена дефолтная тема (которая по умолчанию в XP, синяя), а на другой - классическая тема?

Кстати, насколько разные ОСи на машинах? Это тоже важно: то, что работает на XP может при определенных условиях не так отработать на "Семерке", примеры уже были на форуме.
*kitty*
Я забыла, наверное, самое главное уточнить blush.gif (а слона то я и не заметила... cool.gif ). Из-за того, что были проблемы с vcl60.bpl, пробовала запускать после только на машинах, на которых НЕ установлен Borland C++ Builder. Может именно из-за этого проблемы с цветом?
На рабочем компьютере, на котором делала проект, ХР Service Pack 2 (нелицензионная), тема "Windows XP (изменено)".
Запускала на домашнем ноуте, XP Service Pack 3 (лицензионная), тема "Измененная".
И ещё у друга, XP Service Pack 3 (нелицензионная), тема "Классическая" .
*kitty*
Присоединяю проект просто с формой, которая искажается на других компьютерах, а именно:
1) пропадает голубой цвет "clInactiveCaptionText", установленный у компонента "GroupBox1" (фон картинок с формулами подобран также под этот цвет);
и, соответственно, у компонента "GroupBox2" пропадает серый цвет "clActiveBorder";
2) при запуске отображается не вся форма, а только её часть в окне с прокруткой, то есть приходится вручную подгонять размер окна приложения под форму;
3) часть компонентов смещается друг относительно друга, из-за этого продает (не видна) часть текста, что вообще очень плохо sad.gif

Цвета, конечно, не так страшно, что пропадают, можно обойтись и цветом по умолчанию, а вот сдвиг компонентов нужно как-то исправить. Можно ли как-то зафиксировать их на форме, чтобы такого не происходило? ну и чтобы форма открывалась целиком без прокрутки?

Нажмите для просмотра прикрепленного файла
volvo
Цитата
1) пропадает голубой цвет "clInactiveCaptionText", установленный у компонента "GroupBox1" (фон картинок с формулами подобран также под этот цвет);
С этим и вторым пунктом (хотя у меня пропадает только этот, второй как раз отображается как положено, но это - скорее всего просто повезло) все просто: проблема - как раз в разных темах, как и предполагалось. Как исправить:
1) в режиме Design-а, то есть, еще до запуска программы, пока ты видишь свою форму в визуальном редакторе, для всех RichEdit-ов, лежащих внутри GroupBox-а, устанавливаешь ParentColor в True (тогда цвет не будет устанавливаться вручную, а будет получаться у родительского элемента, что предпочтительнее, достаточно сменить цвет родителя, и все дочерние элементы тоже поменяют цвет). Это можно сделать и в рантайме, скажем, при создании формы, вот так:

    for(int i = 0; i < Form1->ComponentCount; i++)
{
TRichEdit *RE = dynamic_cast<TRichEdit*>(Components[i]);
if(RE)
{
RE->ParentColor = True;
}
}

, но "зачем откладывать на RunTime то, что можно сделать в DesignTime-е?" (почти цитата)

2) А вот что обязательно придется сделать в рантайме - это:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
// Вместо Image4 может быть любое изображение, лежащее на GroupBox1
GroupBox1->Color = Image4->Picture->Bitmap->Canvas->Pixels[0][0];

// аналогично, тут можно использовать любое изображение лежащее на GroupBox2
GroupBox2->Color = Image3->Picture->Bitmap->Canvas->Pixels[0][0];
}

. И проблема решена.

А вот насчет пунктов 2 и 3 - я понимаю, что проблема возникает из-за разного разрешения экрана, что можно сделать - почитай здесь: Multi-Resolution Delphi Applications (к сожалению, тут я помочь тебе чем-то практическим вряд ли смогу, у меня на всех доступных машинах разрешения установлены в 1920х1080, сама понимаешь, что при таких числах маловероятно добиться искажения формы). Если можно - присоедини скриншот, что именно искажается, и относительно чего, тогда хотя бы можно будет посоветовать, какие Anchor-ы выставить...
*kitty*
С цветами проблему исправила good.gif , спасибо smile.gif

На рабочем компьютере расширение 1280 на 1024, но ноуте - 1680 на 1050.
Прикрепляю изображения того, что происходит с формами при запуске на ноуте:
- одна форма:
1) как должно быть: Нажмите для просмотра прикрепленного файла 2) в каком виде открывается: Нажмите для просмотра прикрепленного файла 3) искажения компонентов: Нажмите для просмотра прикрепленного файла

- вторая форма:
1) как должно быть: Нажмите для просмотра прикрепленного файла 2) в каком виде открывается: Нажмите для просмотра прикрепленного файла 3) искажения компонентов: Нажмите для просмотра прикрепленного файла
volvo
Очень интересно. Разрабатывается форма при меньшем разрешении, но при запуске на большем - не отображается полностью. Почему тогда при запуске на разрешении 1920*1080 такого не происходит, и форма отображается совершенно нормально? Неужели дело в версии Билдера?

Попробуй последовать совету, приведенному по ссылке - установи вместо Verdana шрифт Arial, и измени свойство Position формы на poDesktopCenter или на poScreenCenter (это заставит форму отображаться в центре экрана, что возможно решит проблемы с полосами прокрутки)...

Теперь еще один вопрос: а почему, собственно, ты делаешь такую гремучую смесь, как кусок предложения - в RichEdit-е, потом формула - в Image, потом опять RichEdit? Я бы на твоем месте поступил по-другому: набрал бы содержимое каждого из пунктов 1), 2), 3), 4) в отдельном DOC или RTF-файле (прямо вместе с формулами), и вместо TRichEdit+TImage использовал бы один-единственный TOleContainer для каждого пункта (весь абзац имеет смысл только в случае, если на компьютере, где запускается программа гарантированно установлен MS Office. Если нет - то либо оставлять как есть, либо полностью весь пункт, а не только формулу, переводить в изображение и вместо RichEdit+Image пользоваться одним Image).

Но сначала - измени Position и шрифты. Кстати, как вариант - попробуй еще запретить изменение размеров формы (Border установить в bsSingle).

P.S. Кстати, похоже, что дело действительно в версии компилятора: если я запускаю твой EXE-шник, и уменьшаю размер формы вручную, то я получаю эти самые полосы прокрутки. А когда перекомпилирую проект у себя (ничего не изменяя) и пытаюсь уменьшить размер формы - то никаких полос прокрутки уже нет, форма просто уменьшается в размерах, и все, что осталось за ее новыми границами - просто невидимо. Так что тут важно работать с той же версией Билдера, что и у тебя.
TarasBer
Скрины не смотрел - не могу пока, браузер в VGA режиме (640 на 480 при 16 цветах) картинки не показывает, а других режимов нет - дрова слетели, но если по поводу полос прокрутки по краям формы, то у формы 1 у свойств VertScrollBar и HorzScrollBar выставлено Visible в false?
От них зависит наличие полос прокрутки при изменении размеров.
volvo
А в BCB6 что, у этих свойств какое-то другое, отличное от 2009-го Билдера значение? Почему ТАМ полосы появляются, а ЗДЕСЬ - нет, хотя я написал, что ничего не менял.

P.S.
Цитата
у свойств VertScrollBar и HorzScrollBar выставлено Visible в false?
Не влияет. Что True, что False - полосы не появляются.
*kitty*
Цитата
Очень интересно. Разрабатывается форма при меньшем разрешении, но при запуске на большем - не отображается полностью. Почему тогда при запуске на разрешении 1920*1080 такого не происходит, и форма отображается совершенно нормально?
Да, на ноуте расширение больше, единственное экран по ширине меньше... Пробовала выставить расширение как на рабочем компе - та же самая картина. А вот на ещё одном компе, у друга, расширение меньше - 1152 на 864, но экран довольно большой, и открывается без прокруток...

Попробую сейчас сделать то, что посоветовали, надеюсь, поможет.

Цитата
Теперь еще один вопрос: а почему, собственно, ты делаешь такую гремучую смесь, как кусок предложения - в RichEdit-е, потом формула - в Image, потом опять RichEdit?
Действительно, неудачный выбор...blush.gif просто идея с формулами-картинками, пришла позже, чем идея записать последовательность действий, вот и решила просто вставить... Рисковать с TOleContainer не буду, потому что мне показывать проект придется на убитом компе, на котором ничего нет, и преподаватель требует, чтобы ехе полноценно работал при любых условиях... biggrin.gif Поэтому воспользуюсь, наверное, просто Image'ми - так безопаснее будет smile.gif
*kitty*
Цитата
измени свойство Position формы на poDesktopCenter или на poScreenCenter (это заставит форму отображаться в центре экрана, что возможно решит проблемы с полосами прокрутки)...
Помогло respect2.gif
Шрифт меняла, но всё равно сдвигаются текст и картинки относительно друг друга, буду делать сплошными картинками значит.
when do prednisone side effects
Cialis Vendita Pillole
do you need a prescription for p
Mexico Drugs Online
hydroxychloroquine over the coun
Clomid Absence Ovulation
gabriella
Your writings and news are really interesting to me. There are numerous advantages to the contents. Thank you so much. My site:: OLE777
nishaknapp
Why not settling on games that is fun and at the same time your earning. Well itll make suspense because of the game as well but dude just try it and it gave me hope while pandemic is real rn. What Can You Do In 10 Minutes?
gabriella
As a Newbie, I am continuously exploring online for articles that can benefit me. Thank you.
bangkokgoguide.com

Добавлено через 15 мин.
As a Newbie, I am continuously exploring online for articles that can benefit me. Thank you.
zrpoker.com
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.