Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.02.15;
Скачать: [xml.tar.bz2];

Вниз

как преобразовать array и caption ?   Найти похожие ветки 

 
inviz   (2008-12-28 21:03) [0]

здравствуйте! Как решить проблему перевода одного типа данных в другую, пишу:

datatemp = record
   name:array[0..255] of char;
   ...
end;
   ...
datatemp[0].name:=edit1.Text;    - тут ошибка

пишет Incompatible types: "Array" and "TCaption"
тоесть несоответствие типов "массив" и "надпись"
как преобразовать? пробовал datatemp[0].name:=PChar(edit1.Text) не помогает,
datatemp[0].name:=PAnsiChar(edit1.Text) тоже не помогает, пробовал datatemp[0].name:=PWideChar(edit1.Text)
тоже не помогает что делать? :(

з.ы. Пишу в CodeGear RAD Studio Delphi 2009


 
DVM ©   (2008-12-28 21:24) [1]


> что делать? :(

Move()


 
inviz   (2008-12-28 21:39) [2]

Благодарю. Частично работает ))
пишу:

 s:=edit1.Text;                                                  
 Move(s,datatemp[0].name,length(edit1.Text));    
 showmessage(datatemp[0].name);
 m:=datatemp[0].name;
 showmessage(m);


выдает каля-баля несмотря на то что текст в s до операции Move()
отображается нормально...


 
DVM ©   (2008-12-28 21:51) [3]


> inviz   (28.12.08 21:39) [2]

вот тебе туда и обратно:

procedure TForm1.Button1Click(Sender: TObject);
var
 name: array[0..255] of char;
 s: string;
begin
 Move(Caption[1], name[0], 256 * SizeOf(Char));
 s := name;
 Label1.Caption := s;
end;


 
Германн ©   (2008-12-29 01:16) [4]


>  name:array[0..255] of char;

А зачем вообще тут нужен array? Почему не использовать
name : ShortString;?
И тогда вообще никаких проблем.


 
inviz   (2008-12-29 04:47) [5]


> А зачем вообще тут нужен array? Почему не использовать

а файл в который пишу запись нетипизированный


 
inviz   (2008-12-29 07:21) [6]


> DVM ©

Дмитрий! Низкий вам поклон! :) заработало все как надо! :)


 
inviz   (2008-12-29 07:30) [7]

Кстати, чтобы не плодить вопросы в виде новых тем спрошу тут, такой вопрос:
я пишу простенькую базу данных и у меня в ней есть форма добовления записи которая содержит 20 Edit"ов вопрос в следующем - можно ли каким нибудь способом в 1 функцию очистить эти Edit"ы так сказать обнулить? сейчас у меня есть процедура которая очищает все эти Edit"ы:

procedure ClearDataAdd;
begin
edit1.text:=" ";
  ...
edit20.text:=" ";
end;

и мне кажется что это, как то не правельно с точки зрения синтаксиса Delphi, ну или этики написания кода так чтоли выразится...
можно ли как нибудь так:formadd.allcomponent.text:=" "; (ну это пример ^-^)


 
Palladin ©   (2008-12-29 08:17) [8]

TComponent.FindComponent + F1


 
{RASkov} ©   (2008-12-29 09:05) [9]

...или просто пробежаться по контролам(Controls) родителя этих всех эдитов, и если на этом родителе нужно очистить все эдиты, то:
проверка (Controls[i] is TEdit) и при выполнении условия TEdit(Controls[i]).Clear;


 
{RASkov} ©   (2008-12-29 09:07) [10]

> TEdit(Controls[i]).Clear;


> .text:=" ";

При очистки эдитов обязателен пробел? Тогда вместо Clear делай как у тебя: TEdit(Controls[i]).text:=" ";


 
inviz   (2008-12-29 10:45) [11]


> {RASkov} ©
> и при выполнении условия TEdit(Controls[i]).Clear;

Во спасиб а я думаю ну как то ж должнобыть отслеживание контролов

> При очистки эдитов обязателен пробел?

да не это я тут писал думал что не видно будет...


 
Германн ©   (2008-12-29 13:47) [12]


> inviz   (29.12.08 04:47) [5]
>
>
> > А зачем вообще тут нужен array? Почему не использовать
>
> а файл в который пишу запись нетипизированный
>

Ну и?


 
inviz   (2008-12-29 22:07) [13]


> Германн ©
> Ну и?

нада попробовать...


 
Германн ©   (2008-12-30 00:59) [14]


>
> inviz   (29.12.08 22:07) [13]
>
> > Германн ©
> > Ну и?
>
> нада попробовать...

Чудаки вы, мОлодежь!
В одних вдолбили, что тип String может содержать не более 255 символов и они спрашивают "как в Дельфи записать в строку больше 255 символов".
Другим (вроде тебя) вдолбили, что при сохранении в файл нельзя использовать в Дельфи тип String. Ибо при этом в файл записывается указатель на переменную этого типа в АП записывающего процесса, а не сама строка. Но забыли вспомнить родную Паскалевскую строку.


 
DevilDevil   (2008-12-30 13:06) [15]

procedure TForm1.Button1Click(Sender: TObject);
var
name: array[0..255] of char;
s: string;
begin
Move(Caption[1], name[0], 256 * SizeOf(Char));
s := name;
Label1.Caption := s;
end;


аааАА!!!! Это что за страх вообще???
Это ещё и к AV не приводит?

// если в name после строковых сиволов идёт символ #0
procedure NameToString(var S: string; const name: array[0..255] of char);
begin
 S := name;
end;

procedure StringToName(var name: array[0..255] of char; const S: string);
var
 Len: integer;
begin
 Len := Length(S);
 if (Len > 255) then
 raise Exception.CreateFmt("Всё, пипец, S - слишком длинная строка(%d символов)", [Len]);

 // скопировать символы
 CopyMemory(@name, pointer(S), Len);
 // завершающий символ
 name[Len] := #0;

 {
   Но можно и одной функцией CopyMemory(@name, pointer(S), Len+1);
   А если без проверки, то реализация - одна строка: CopyMemory(@name, pointer(S), Length(S)+1);
 }
end;


 
DevilDevil   (2008-12-30 13:08) [16]

Added:  Последний параметр CopyMemory надо домножать на sizeof(char)


 
DVM ©   (2008-12-30 13:49) [17]


> DevilDevil  


> аааАА!!!! Это что за страх вообще???
> Это ещё и к AV не приводит?
>

Не приводит. И не приведет. Никогда. Просто надо хорошенько на него посмотреть и подумать.

А вот твой код в общем случае не рабочий вообще. Увы. И чтобы это понять, надо  взять к примеру последнюю версию Delphi.


 
DVM ©   (2008-12-30 14:24) [18]


> DevilDevil

Более того, код не то что не рабочий, он даже не может быть скомпилирован.


 
DevilDevil   (2008-12-30 16:03) [19]

>И чтобы это понять, надо  взять к примеру последнюю версию Delphi.
пост [16]

>Более того, код не то что не рабочий, он даже не может быть скомпилирован.
фигня. array[0..255] of char ---> type Tname

>Не приводит. И не приведет. Никогда.
>Просто надо хорошенько на него посмотреть и подумать.


Move(Caption[1], name[0], 256 * SizeOf(Char));

Вызывает RangeError, если Caption = ""
Из строки нельзя читать 256 символов, если их там меньше 255. То, что нет AV - чудо.

Я неправ?


 
inviz   (2008-12-30 16:28) [20]


> Более того, код не то что не рабочий, он даже не может быть
> скомпилирован.


как это не может быть скампелирован? все компелируется не нада понимать буквально array[0..255] of char и вставлять
это подразумевает n:array[0..255] of char.


>  >Просто надо хорошенько на него посмотреть и подумать.Move(Caption[1],
>  name[0], 256 * SizeOf(Char));Вызывает RangeError, если
> Caption = ""

а че тут думать ? вот как использую я код приведенный в 4-ом посте DVM

var
name:array[0..255] of char;
s:string
begin
s := edit1.Text;
 Move(s[1],name,256 * SizeOf(Char));

все отлично работает за это еще раз спасибо DVM.

> DevilDevil
> Из строки нельзя читать 256 символов, если их там меньше
> 255. То, что нет AV - чудо.Я неправ?

Ты не прав если говоришь про array[0..255] of char их там не 255 а 256,
что 0 для тебя не цифра? дословно от нуля до двухсот пятидесяти пяти эквивалентно от одного до двухсот пятидесяти шести
Вопрос был "как преобразовать "array" и "caption"?"
Ответ был получен еще в 4 посте. Тема закрыта хватит флудить


 
Anatoly Podgoretsky ©   (2008-12-30 17:07) [21]

> inviz  (30.12.2008 16:28:20)  [20]

Зато в S не 256


 
DevilDevil   (2008-12-30 17:11) [22]

> inviz   (30.12.08 16:28) [20]

эх и нифига!
нормально вообще! ))
ну фиг с тобой, живи и возрадуйся обожаемой всеми "ошибке памяти непонятно откуда"


 
DVM ©   (2008-12-30 20:45) [23]


> DevilDevil   (30.12.08 16:03) [19]

Во-первых.

Я лишь привел пример использования данной функции, но подразумевалось, что не стоит слепо повторять написанное, это же очевидно. Данные строки лишь иллюстрировали то, что Move() перекрасно может выполнять то, что требуется. Писать развернутый пример,учитывая все возможные внешние факторы мне просто было лень. И мне непонятна твоя реакция неадекватная на это.


> То, что нет AV - чудо.

Это не чудо. Но в так делать конечно не следует.


> Вызывает RangeError, если Caption = ""

Не надо бояться исключений. Их лишь надо перехватывать и обрабатывать, если на то есть нужда. В принципе блок обработки исключения сделает то же самое по сути, что ты сделал бы, например с помощью ветвления и проверки до вызова Move.

Во-вторых.

Проблему своего кода ты так и не увидел. С какой стати в последний элемент массива ты кладешь #0? Кто сказал, что там должен быть 0? Кто-то хотел этот 0 сохранять в файл? А он будет ведь сохранен туда. Про си строки можешь не вспоминать - это всем и так известно. Но кто сказал, что в массиве си-строка? Своим эти нулем плюс ко всему, ты принудительно ограничил размер данных в массиве 255 символами, в то время как их там могло бы быть 256. 1 символ ты откусил под терминатор.
Не знаю, хорошо ли объяснил, но надеюсь суть ясна.


 
DevilDevil   (2008-12-31 09:40) [24]

кхм...

1) дошло, почему скорее всего не вызовет AV
2) вероятность AV всёже есть. + если строка пуста (pointer(S) = nil), то должен быть AV
3) это очень некорректное обращение со строками. Поэтому и реакция соответсвующая.
4) исключений надо бояться. И не допускать гоблинского кода.
5) если строку вдальнейшем планируется преобразовывать к строке (Caption := name), то нужен 0 в конце. Как минимум, должен быть "показатель длинны"


 
DVM ©   (2008-12-31 15:47) [25]


> DevilDevil   (31.12.08 09:40) [24]


> вероятность AV всёже есть

Есть.  Я даже знаю в каком случае :) Но вероятность этого случая мала.


> 4) исключений надо бояться. И не допускать гоблинского кода.

Гоблинского кода конечно допускать не надо в реальных приложениях. Но то реальное приложение, а не пара строк на форуме.

Насчет исключений ты не прав. Их основное предназначение как раз и есть - отделение места обработки ошибки от места ее возникновения. Как считается способствует удобочитаемости кода. Конечно спорный вопрос, не всем такой подход нравится (мне тоже не очень), но подход правильный. Другое дело, что надо ухо держать востро с этими исключениями, особенно при выделении и освобождении ресурсов и в серверных или многопоточных приложениях.


> если строку вдальнейшем планируется преобразовывать к строке
> (Caption := name), то нужен 0 в конце

0 нужен лишь для того, чтобы понять где конец строки. Если конечно это строка. В массиве предварительно проиннициализированном нулями это необязательно. т.к. если последний символ не 0 длина известна, в противном случае нули укажут на конец.

Если массив был проиннициализирован нулями то 0 там будет в конце в любом случае.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.02.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.007 c
2-1230969991
N_SSS
2009-01-03 11:06
2009.02.15
Подключение справочников (Lookup) для DbGridEh


15-1229923501
belmol
2008-12-22 08:25
2009.02.15
BYTE


10-1152721470
TStas
2006-07-12 20:24
2009.02.15
Как узнать число листов в экселевской книге?


2-1231102705
bit
2009-01-04 23:58
2009.02.15
db component and ACSII


15-1229688631
Кое кто
2008-12-19 15:10
2009.02.15
Как переводиться have got?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский