Вход | Регистрация


Информационные технологии ::

Метки:

Нужна помощь с...

Я
   Wow_Cool
 
09.12.03 - 19:17
Народ! Помогите, а то я с ума сойду!!!
Я может не совсем по адресу, но вдруг вы это знаете.
Пишу программу в Delphi, использую BDE, короче базу данных делаю, а тут такая проблема...
Итак вопрос:
Надо из Table прочитать первую строчку, но кодировка у нее какая-то странная, я нужную кодировку подобрала, но установить ее можно только в DBGride , а как это сделать  таблицей. Вообще надо использовать свойство Charset (судя по DBgrid), но у Table  ничего такого и в помине нет. Что делать?
 
  AdBlock убивает бесплатный контент
   Wow_Cool
 
1 - 09.12.03 - 19:22
Ну вот, нигде не нашла ответа, и что делать, как жить???
   skunk
 
2 - 09.12.03 - 22:09
А почему бы данные не выгребать из DBGrid связав его через DataSource с Table. Есть принципиальная разница
   valich
 
3 - 10.12.03 - 03:22
Wow_Cool, не расстраивайся так сильно, попробую помочь!
Судя по твоему описанию ты использовала DBGrid1.Font.Charset. А если я не ошибаюсь, это свойство (имеется только у визуальных компонентов) отвечает за использование набора символов в шрифте. Ведь в каждом "правильном" шрифте есть несколько наборов символов. Один для кириллицы, один для латиницы, один для греческого и т. д.
В общем проблема наверное должна решиться заменой используемого шрифта на любой другой точно имеющий поддержку кириллицы. Судя по всему у твоего шрифта нет кириллических символов.
Если Windows "русский" это не проблема. Попробуй подобрать другой шрифт.
Еще попробуй посмотреть установки локали в системе. Это на панели управления (в Windows 2000) ярлык "Язык и стандарты". Там должно быть установлено Язык (местоположение) - Русский.
Если же все вышеперечисленное не поможет, то проблема вероятно лежит глубже. И тогда мне потребуется более подробная информация.
В первую очередь, какую БД ты используешь - Paradox, FoxPRO (dbf) или что другое...
В общем пиши...
   skunk
 
4 - 10.12.03 - 05:48
(3)valich, позволь с тобой не согласиться. Причем тут шрифты и прочие установки в виндовс. Что такое шрифт, да это просто пронумерованный набор картинок, где каждой картинке соотвествует какой либо номер. Соглашение о соотвествии визуальных картинок с их номерами и называется кодировкой. Файле данных хранится  не набор картинок а их номера. Поэтому установка разных параметров в языках и стандартах явно проблему не решит.
wow надо определится, что она хочет делать с прочитаными строчками. Поскольку, руку даю на отсечение используется DBase или Paradox c DOS кодировкой, то бишь проблема с обработкой строк русского текста.
Есть три решения проблемы. Первые два если надо отображать где то прочитанные данные, выводить строки на экран, в файл просматриваемый в виндовс. Третий если этого делать не надо.
Самый первый легкий, читай - (2). Плюс - не надо геморойничить. Минус - два лишних компонента.
Второй писать свой транслятор из одной кодировки в другую. Тобишь написать функцию которая получает набор данных в одной кодировке и переводит их в другую. Плюс минус меняются местами(см. первое).
Третий подойдет только в том случае если на основании данных содержащихся в этих строках программа должна делать те или иные действия. Блин не знаю как по русский сказать но что типа того.
есть кусок текста
function ReadStr(str: string);
var
 result: integer;
begin
 case str of
   'Работа' : result := 1;
   'Учеба'  : result := 2;
 else
   result := 0;
 end;
 ReadStr := result;
end;

меняешь к пимеру для обработки dos кодировки

function ReadStr(str: string);
var
 result: integer;
begin
 case str of
   'ђ Ў®в ' : result := 1;
   '“祡 '  : result := 2;
 else
   result := 0;
 end;
 ReadStr := result;
end;
   Vser1
 
5 - 10.12.03 - 10:26
Wow_Cool, если у тебя используется база созданная в Fofpro, под ДОС версии 2.0-2.5, то там (в заголовке таблицы по умолчанию) не ставиться символ признака кодировки символов. Если не изменяет память это должна быть английская буква "е" 32-рым символом от начала файла БД для досовской кирилицы.
   valich
 
6 - 10.12.03 - 10:58
(4) Нет уж, коллега! Позвольте теперь мне с вами не согласиться.
Вот вы пишете:
<- Соглашение о соотвествии визуальных картинок с их номерами и называется кодировкой ->
Теперь давайте уточним:
В данном соглашении говориться, что начиная с такого-то номера по такой-то (извините, так на вскидку не смогу назвать их конкретно) хранятся, к примеру, кириллические символы и т. д.
Рассуждаем дельше:
Если шрифт не имеет поддержку кириллицы, или, например, это "битый" шрифт, то как бы вы не изгалялись, извините за выражение, не получиться у вас отобразить вашу кириллицу на экран (или печать) правильно.
Ремарочка:
Битый шрифт - это когда вы берете за основу, например, шрифт от Microsoft и слегка переделав его выдаете за свой. Естественно забыв о кириллических символах. В свое время это был довольно прибыльный вид плагиата. Ошибки при переделке чужих шрифтов вещь очень распространенная, т. к. обычно его делают не специалисты, а дело это крайне сложное. Я имею ввиду, в частности, шрифты True Type Font.
Продолжим:
Почему же все-таки я пришел к предположению что проблема именно в этом.
Рассуждаем дальше:
У текстовых визуальных компонентов Delphi существует комплексный параметр (свойство) – Font. Помимо всего прочего у этого свойства есть вложенное свойство Charset, которое по умолчанию всегда ставиться как DEFAULT_CHARSET. Именно эта установка позволяет определять Delphi, что в данном случае следует использовать системную кодировку «по-умолчанию». А эта системная кодировка задается не как иначе, как явным указанием локали.
Если вы попробуете поиграться с этим свойством, то получите на экране очень интересную картину. Ваш текст будет отображаться самым причудливым образом. Тут важно, что названные изменения происходят без изменения указанного в компоненте шрифта. Что в свою очередь говорит нам о том, что текст просто выводиться с применением разных кодовых страниц.
А так как WOW_Cool утверждает, что именно это свойство в компоненте DBGrid помогло ей решить проблему, я и пришел к выводу, что мы имеем дело именно – либо с неправильно указанной кодировкой, либо со шрифтом не поддерживающим кириллический набор символов.
Теперь о кодировках:
Давайте попробуем провести небольшой эксперимент. Создадить при помощи Database Desktop табличку, скажем, формата Paradox. Укажем у нее одно текстовое поле и кодовую страницу – Paradox Cyrr 866. Теперь в Delphi соорудим небольшую программку по доступу к этой таблице. Правда придется разместить таблицу по какому-нибудь алиасу (для BDE). В програмке можно просто редактирование таблицы в DBGrid сделать. Теперь скомпилируем ее. И попробуем ввести в нее данные с клавиатуры. Выйдем из программы. Откроем файл таблицы текстовым редактором понимающим обе кодовые страницы (866 и 1251). Например читальщиком встроенным в Total Commander. В нем есть принудительное переключение между кодировками. Включим принудительно кодировку DOS (866). И что же мы видим? Правильно, текст введенный нами в таблицу из программы созданной в Delphi.
Вывод:
Что и требовалось доказать. Связка Delphi+BDE сама разбирается в кодировках таблицы. Делается это посредством языкового драйвера указанного для таблицы. Так что skunk, извини, но твое предложение провести перекодировку вручную несколько неуместно.
Небольшое отступление:
Действительно Delphi легко разбирается с кодировками в базах формата Paradox. Но ведь это ее «родной» формат. Я совершенно не уверен что все пройдет также гладко и, например, с форматом DBF (FoxPro). Microsoft не очень-то любит делиться своими технологиями. Поэтому Borland в свое время прямо заявляла, что поддерживает ее технологии частично, в зависимости от имеющихся спецификаций. Именно поэтому я и задал вопрос о формате базы.
В общем пока все…
   skunk
 
7 - 10.12.03 - 11:28
(6)valich если бы шрифт был битый, как вы выразились заментить, то что мы бы наблюдали на экране виндовс, при отображении рууских букв. Ваши предположения можно услышать. WOW на подобное не жалуется. Причем она говрит, что при выборе другой кодировки текст отображается читабельно. При чем тут шрифт не пойму ни как.
А теперь в продолжения вашего эксперемента попробуйте открыть эту табличку из приложения созданного дельфином и использовать один компонет table, что в принципе и говориться в задаче. И получить читабельный шрифт без трансляции на экране монитора. Если у вас это получится вы скажите wow как это сделать. Суть всего вопроса. А я соглашусь с понятием битого шрифта.
   pvf
8 - 10.12.03 - 17:43
Подскажите, пожалуйста кто знает, где взять описание методов для работы в 1С с объектами "MSXML2.XMLHTTP" и "MSXML2.DOMDocument".
   skunk
 
9 - 10.12.03 - 17:45
(8)Ты не в тут тему попал. :)
   pvf
10 - 10.12.03 - 17:51
Другой уж не нашел, извини! :(
 
 
   skunk
 
11 - 10.12.03 - 17:53
Создай новую
   skunk
 
12 - 17.12.03 - 02:59
valich почитай про кодировки
http://www.compz.ru/index.php?action=viewarticle&id=7
   valich
 
13 - 17.12.03 - 11:00
Вот, все никак не соберусь написать…
Для начала надо skunk ответить, а то как то нехорошо получается…
<-- если бы шрифт был битый, как вы выразились заментить, то что мы бы наблюдали на экране виндовс, при отображении русcких букв -->
Видимо меня не правильно поняли! Я писал:
<-- У текстовых визуальных компонентов Delphi существует комплексный параметр (свойство) – Font. Помимо всего прочего у этого свойства есть вложенное свойство Charset, которое по умолчанию всегда ставиться как DEFAULT_CHARSET. -->
У комплексного свойства FONT есть также вложенное свойство NAME. Оно служит для указания наименования шрифта, например, MS Sans Serif. Именно этот шрифт Delphi устанавливает по умолчанию. Я же просил попробовать сменить не файл шрифта в системе, а поменять значение именно этого свойства…
Поясню почему же это (смена шрифта) стало первой моей просьбой. Я неоднократно сталкивался с этой проблемой некоторое время назад, когда общался со студентами МЭСИ. Они, когда проходили среду Delphi частенько обращались ко мне по поводу похожей проблемы. Видимо для того чтобы сделать свой проект покрасивше они меняли свойство FONT.NAME у формы (да и у всех других компонентов), а потом долго удивлялись, почему их Grid’ы (наследовавшие шрифт указанный на форме) неправильно отображали данные. Самое интересное, обращений ко мне было до десятка, и все от разных людей. Видимо проблема довольно распростаненная. И конечно, если Delphi у Wow_cool использует тот же шрифт, что и система (MS Sans Serif), то соответственно этот пункт отпадает.
Теперь дальше:
<-- Причем она говорит, что при выборе другой кодировки текст отображается читабельно. При чем тут шрифт не пойму ни как. -->
Тут могу только сказать, что было бы неплохо если бы Wow_cool указала значение свойства Charset, при котором текст стал правильно отображаться. Это сразу бы решило пол-проблемы. И потом, если в указанном в Delphi шрифте нет поддержки кодировки которая указана в таблицах, то тогда я не пойму, почему это не проблема шрифта.
Теперь по поводу описанного мной эксперимента. Вы меня, коллега, даже заставили поволноваться ;)
Перепроверил много раз и на работе и дома, на 3, 5 и 6 версиях. Все работает. Можно многократно открывать и редактировать. Все отображается правильно. Так что BDE и сам неплохо делает перекодировку. Как я уже и говорил, он (BDE) пользуется собственным алгоритмом. На вход этого алгоритма подаются исходная кодировка (указывается кодовая страница таблицы) и целевая кодировка (активная кодовая страница в системе). Зачем же его писать еще раз?

Ну ладно. Теперь хотелось бы немножко «отсебятины» добавить. Поймите правильно, это только мое мнение относительно меня.
Не знаю как другие ;), но я себя программистом в полном смысле этого слова не считаю. Слишком редко приходиться работать именно с системными задачами. В основном я кодировщик. А что такое кодировщик? Это человек решающий свои проблемы с помощью чужих достижений. Или сказать правильнее, человек стоящий на плечах гигантов. Ведь, например, когда перед кодировщиком ставится задача обработать данные он не идет писать СУБД а просто выбирает уже готовую, по своему вкусу (ну не всегда конечно ;). IMHO это и есть первостепенная задача кодировщика. Решение своих задач путем максимального использования «чужих» решений. Именно с этой позиции я и считаю неуместным писать свою процедуру перекодировки. Слишком затратно по ресурсам. Может я конечно и не прав, но я бы попробовал сначала решить проблему, именно ПРОБЛЕМУ! Потому что Delphi и BDE достаточно развитые продукты, и если под ними что-то не работает я обычно начинаю искать глюки у себя в голове, а уж потом у Borland. Кстати, очень интересное сообщение у Vser1. Что легче, поправить один байт в таблице, или писать процедуру перекодировки?
Но, на самом деле skunk, мне очень понравился твой подход! Так, незатейливо, и в лоб! Хорошо что на самом деле процедура перекодировки относительно несложна в исполнении. А если бы проблема была масштабней? Ты бы посоветовал переписать часть функций ОС внутри моего Delphi-проекта?
Вот блин, допечатался, аж пробел на клавиатуре залипает ;)
Skunk, хочу заранее принести тебе извинения, моя писанина наверное выглядит как наезд ;) В общем повторюсь это только мое мнение, и касается оно только меня. Если оно кому-то понравилось, я  рад ;) Если нет, и есть желание поспорить, я готов поучаствовать.
   valich
 
14 - 17.12.03 - 11:02
Ну и самое главное. Wow_Cool видишь какие тут страсти разгорелись. Народ просто на измене. Пожалуйста, напиши, чем сердце успокоилось! Или может еще нет?
   skunk
 
15 - 17.12.03 - 11:51
(14)Теперь я чего-то не понимаю. Не могли бы вы мне мылом сигануть примерчик вашей программы и файлик db. Если конечно это вас не затруднит.
   fellow
16 - 17.12.03 - 16:04
Коллега Wow_Cool, поскольку Вы делаете всё самостоятельно, и программу, и саму базу (насколько я понял), и работаете через BDE, то создайте базу сразу с нужной кодировкой, будь то кодировка dbase RUS 866 либо ANSI Cyrillic. А всё остальное работает и само, с шрифтами по умолчанию.
   valich
 
17 - 17.12.03 - 23:01
(15) Примерчик сиганул. Обсудим?
   skunk
 
18 - 18.12.03 - 02:04
(15)valich, честно без обид прочитай (2). Прочитал а теперь (7), еще раз подчеркиваю:
------------------------------------
"А теперь в продолжения вашего эксперемента попробуйте открыть эту табличку из приложения созданного дельфином и использовать один компонет TABLE"
------------------------------------
то есть нет у ВАС компонента DataSource и DBGrid, как выходить из положения.
   skunk
 
19 - 18.12.03 - 09:53
(15)Ответь valich, а то я командировку собираюсь. Ведь пока буду ездить измучуюсь.
   valich
 
20 - 18.12.03 - 10:50
skunk а надолго в командировку? Счас смотрю как обратиться к языковому драйверу без тех средств, что ты указал. Блин, совсем разучился с BDE работать.
Может отложим до после командировки? А вообще надеюсь сегодня до вечера управиться (оптимистично так)...
   skunk
 
21 - 18.12.03 - 10:52
Завтра рано утром выезжаю, в понедельник думаю вернуться, хотелось бы раньше. Но там как бог пошлет.
   valich
 
22 - 18.12.03 - 11:02
(19,21) Ну что ж, в свое оправдание могу только сказать: "Сам мучаюсь!". Там есть такие функции...
DbiAnsiToNative и наоборот. Вот только их впишу (забыл как языковой драйвер из таблицы выщемить) и тогда...
   skunk
 
23 - 18.12.03 - 11:14
Но согласись, что настройки языка были не в тему. Кстати а где хозяйка ветки, что-то я ее давно не видел.
   valich
 
24 - 18.12.03 - 11:50
(23) А что ты имеешь ввиду под настройками языка?
   skunk
 
25 - 18.12.03 - 11:53
Да в принципе из-за чего весь сыр бор разгорелся. Решение проблемы описанной в топик (3).
   valich
 
26 - 18.12.03 - 12:07
(25) А я разве не говорил? Мое упущение. Я сам с подобной проблемой сталкивался на beta-версиях W2k и XP. У меня ж бзик, новая операционка, значит надо поставить. Правда тут же проверяю как работает Delphi под ней. И в результате, помню на 2000 точно были проблемы...
   valich
 
27 - 18.12.03 - 12:09
(25) И потом skunk, присмотрись, там же не решение описано а несколько предположительных вариантов ;)
   skunk
 
28 - 18.12.03 - 12:10
(26)valich, ладно я сдаюсь. Будем считать, что ты победил. ;)
блин, а то я ни куда не уеду, или по дороге всех загребу.
   valich
 
29 - 24.12.03 - 11:44
skunk, я смотрю ты вернулся...
Посылал тебе два исходника, хотелось бы услышать твой комментарий...
   skunk
 
30 - 24.12.03 - 12:18
valich, еще утром хотел отписаться, но там то одно то другое.
Пример 1.
Скопилил, правда из-за того что не было под рукой ни одного парадоксного файла, воткнул дбф. Дельфи его кольпильнул, запустил и все. Насколько я понял по нажатию кнопок он должен был переберать записи и показывать их в метке. Ни фига, как стоял метка1 так и стоит.
Пример 2. Вообще отказался компилиться выдав кучу ошибок и предупреждений. Половину из них я разгреб. Две ошибки слылались на отсутсвие файлов в проекте(так думаю мож ты мне всю диру "D:\DB_DOS\Для skunk 3" вышлешь). И куча предупреждений типа использование этого не есть хорошо и не обеспечит 100 процентную совместимость. В основном жадовалось на работу с указателями и непосредственной адресации памяти. Но из текста второго примера понял, что ты гонишь в принципе тот же транслит только дургим способом пологаясь на дельфи. Не проше ли сделатьт это так

function translit(str: string): string
begin
 for x := 1 to length(str) do
 begin
   case str[x] of
     'а'..'я', 'А'..'Я' : str[x] := str[x] - offset;
   end.
 end;
end;

Для компиляции использовал Delphi 7.0, правда ставил его рядом с builder c++. Мож в этом какая проблема.
   valich
 
31 - 24.12.03 - 13:24
skunk, только вечером, на работе исходников не сохранилось...
   valich
 
32 - 24.12.03 - 13:47
Вот ведь, не удержался, skunk, первый пример (переделанный) сиганул. Вместе с exe-шником и таблицей...
   skunk
 
33 - 24.12.03 - 14:25
Все первый есть. Все работает. Убедил. Признаю, был не прав  с Table.
 
  AdBlock убивает бесплатный контент
   valich
 
34 - 24.12.03 - 14:52
Хороший, плохой, главное у кого ружье. /цитата/
В смысле прав, не прав, какая разница.
Мне понравилось, поясню почему. Иногда так думаешь, что все уже видел, и на тебе, присмотришься, а все не так...
В смысле, мнение другого человека позволяет взглянуть на проблему с другой стороны...
Слушай, наверно надо исходники выложить, а то kos опять скажет - флейм развели ;)
Жаль больше поспорить не с кем, я ведь в ветках 1С не участвую. А здесь и народу как-то немного (впрочем, логично)... Спасибо тебе (за терпение ;)... А второй примерчик вышлю с комментариями...



Список тем форума
AdBlock убивает бесплатный контент   AdBlock убивает бесплатный контент
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
AdBlock убивает бесплатный контент