Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Со строкой, как с массивом 
:(
    Опции темы
Baa
Дата 15.5.2004, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: нет
Всего: 12



Объясните мне, товарищи, могу ли я работать со строкой, как с массивом?
Я создаю в аксесе форму. Кладу на неё EditBox. Мне надо текст оттуда вытаскивать посимвольно. Я использую для этого функцию mid, но нельзя ли как-нибудь проще?


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Skywalker
Дата 15.5.2004, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 17.11.2003
Где: Днепропетровск, У краина

Репутация: нет
Всего: 2



в Accesse есть возможность использовать большинство комманд и функций vb... попробуй тогда left() и right()


--------------------
"Мы в ответе за тех, кого приручили" Антуан де Сент Экзюпери, Маленький принц
PM MAIL WWW ICQ   Вверх
-Mikle-
Дата 15.5.2004, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 8
Всего: 59



Я не знаю сработает ли это в Access, но в VB работает без проблем

Код
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Sub Example()
  Dim b() As Byte
  Dim s As String
 
  s = "Hello world"
  ReDim b(1 To Len(s))
 
  CopyMemory b(1), ByVal s, Len(s)
 
  MsgBox ChrB(b(7)) & ChrB(b(8)) & ChrB(b(9)) & ChrB(b(11)) 'Вернет " word "
End Sub



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Baa
Дата 18.5.2004, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: нет
Всего: 12



Мой код ниже
Вот как бы его улучшить? некрасивый он, на мой взгляд. Притом мне совсем не нраится именно выдерание символов из строки при помощи функции.
Код

Dim strTemp As String
   Dim strSymbol As String
   strTemp = txtMemo.Value
   
   If strTemp <> "" Then
       For i = 1 To Len(txtMemo.Value)
           strSymbol = Mid(strTemp, i, 1)
           rstTemp.Open "SELECT * FROM tblHaf WHERE Symbol = '" & strSymbol & "'", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
           If rstTemp.BOF = True And rstTemp.EOF = True Then
               rstTemp.AddNew
               rstTemp("Symbol") = strSymbol
               rstTemp("Quant") = 1
               rstTemp("Frequency") = 1 / Len(txtMemo.Value)
               rstTemp.Update
           Else
               rstTemp("Quant") = rstTemp("Quant") + 1
               rstTemp("Frequency") = rstTemp("Quant") / Len(txtMemo.Value)
               rstTemp.Update
           End If
                   
           rstTemp.Close
       Next i
   End If



--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Vach
Дата 19.5.2004, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 17.10.2003
Где: Санкт-Петербург

Репутация: 8
Всего: 18



Вот вариант, должен работать быстрее, но я не мерил.
А зачем это нужно, если не секрет?

Код
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Sub Command1_Click()
   Dim rstTemp As Recordset
   Dim strTemp As String
   Dim nLen As Integer
   Dim b() As Byte

   strTemp = Text1.Text
   nLen = Len(strTemp)

If strTemp = "" Then Exit Sub

ReDim b(1 To nLen)
 
CopyMemory b(1), ByVal strTemp, nLen

Set rstTemp = DataEnvironment1.rstTemp

rstTemp.Source = "SELECT * FROM tblHaf"
rstTemp.Open

For i = 1 To nLen

   rstTemp.Find "Symbol = '" & Chr(b(i)) & "'"

   If rstTemp.EOF = True Then
       rstTemp.AddNew
       rstTemp("Symbol") = Chr(b(i))
       rstTemp("Quant") = 1
       rstTemp("Frequency") = 1 / nLen
       rstTemp.Update
   Else
       rstTemp("Quant") = rstTemp("Quant") + 1
       rstTemp("Frequency") = rstTemp("Quant") / nLen
       rstTemp.Update
   End If

   rstTemp.MoveFirst

Next i

rstTemp.Close

Set rstTemp = Nothing

End Sub

PM MAIL ICQ   Вверх
Akina
Дата 19.5.2004, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата
Мой код ниже
Вот как бы его улучшить?


Код

...
With rstTemp
.Open "SELECT * FROM tblHaf WHERE Symbol = '" & strSymbol & "'", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
If .RecordCount = 0 Then
              .AddNew
              !Symbol = strSymbol
              !Quant = 1
Else
              !Quant = !Quant + 1
End If
!Frequency = !Quant / Len(txtMemo.Value)
.Update
.Close
End With
...



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Baa
Дата 20.5.2004, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: нет
Всего: 12



Зачем это нужно? знанимаюсь реализацией кода Хаффмана...
Дальше еще интересней... вот только не знаю, стоит ли отдельную тему создавать? Вобщем, если что, прошу прощения у модератора.
Смотрим, составили мы нашу табличку. Все ок smile.gif Теперь надо составить еще одну %)
Цитата

Левое поддерево Text LNode
Содержимое вершины Text TopSource
Частота Double Frequency
Правое поддерево Text RNode

Так вот smile.gif Надо эту новую табличку заполнить
Великое извращение делать это в аксесе, но приходится.
Соотв. заполнить её по этому алгоритму, беря данные из таблицы, которую заполняли выше.
http://www.avhohlov.narod.ru/p2500ru.htm
Но что-то у меня ну никак не получается придумать алгоритм заполнения...
Буду благодарен за идеи. Да, кстати, тему не стоит переносить в алгоритмы, ибо алгоритм сам я знаю и могу реализовать в других условиях (языках).

Добавлено @ 14:24
Akina, использование конструкции with считается некорректным с точки зрения структурного программирования т.к. она больше запутывает, чем дает реальную выгоду.
RecordCount использовать также не рекомендуется.
Цитата

Use the RecordCount property to find out how many records are in a Recordset object. The property returns -1 when ADO cannot determine the number of records or if the provider or cursor type does not support RecordCount. Reading the RecordCount property on a closed Recordset causes an error.

If the Recordset object supports approximate positioning or bookmarks—that is, Supports (adApproxPosition) or Supports (adBookmark), respectively, return True—this value will be the exact number of records in the Recordset, regardless of whether it has been fully populated. If the Recordset object does not support approximate positioning, this property may be a significant drain on resources because all records will have to be retrieved and counted to return an accurate RecordCount value.

The cursor type of the Recordset object affects whether the number of records can be determined. The RecordCount property will return -1 for a forward-only cursor; the actual count for a static or keyset cursor; and either -1 or the actual count for a dynamic cursor, depending on the data source.



--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Vach
Дата 20.5.2004, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 17.10.2003
Где: Санкт-Петербург

Репутация: 8
Всего: 18



Можно в старой таблице дерево строить. Так проще. smile.gif
Изменения
Добавь поля: Level, id_Next_Level, LR. Все Integer
(Замени тип "Symbol" на Integer и работай с ASCII кодом, так избежишь проблем с непечатными символами.) - ето так, мысли в слух

После выполнения получится запись с Level = 1 это и есть верх дерева
От "Symbol" поднимайся на верх по "id_Next_Level" и составляй код по "LR"

Код
Dim db As New Recordset
Dim db2 As New Recordset

Dim RC As Integer

Dim Quant1 As Integer
Dim Quant2 As Integer

Dim nF1 As Integer

db.CursorLocation = adUseClient
db2.CursorLocation = adUseClient
db2.Open "SELECT tblHaf.id, tblHaf.Quant, tblHaf.Level, tblHaf.id_Next_Level, tblHaf.LR FROM tblHaf WHERE (((tblHaf.Level) = 0));", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic

Do
db.Open "SELECT tblHaf.id, tblHaf.Quant, tblHaf.Level, tblHaf.id_Next_Level, tblHaf.LR FROM tblHaf WHERE (((tblHaf.Level) = 1)) ORDER BY tblHaf.Quant;", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic

RC = db.RecordCount

If RC = 1 Then Exit Sub

db2.AddNew
db2("Level") = 1
db2.Update

Quant1 = db("Quant")
db("Level") = db("Level") + 1
db("id_Next_Level") = db2("id")
db("LR") = 1
db.Update

db.MoveNext

Quant2 = db("Quant")
db("Level") = db("Level") + 1
db("id_Next_Level") = db2("id")
db("LR") = 0
db.Update

db2("Quant") = Quant1 + Quant2
db2.Update

DoEvents

db.Close

Loop Until RC = 1

db2.Close



PM MAIL ICQ   Вверх
Alexei
Дата 21.5.2004, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 20.8.2003

Репутация: нет
Всего: 4



Байты в строку и наоборот:
Private Declare Function lstrcpyToArray Lib "kernel32" Alias "lstrcpyA" (deststring As Byte, ByVal srcstring$) As Long
Private Declare Function lstrcpyFromArray Lib "kernel32" Alias "lstrcpyA" (ByVal deststring$, srcstring As Byte) As Long

Использовать так:
Call lstrcpyToArray(buffer(0), string)
Call lstrcpyFromArray(string, buffer(0))

Это сообщение отредактировал(а) Alexei - 21.5.2004, 08:27
PM MAIL   Вверх
Baa
Дата 22.5.2004, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: нет
Всего: 12



Alexei, да неправильный это подход... цель была найти какой-нить простой способ без объявления дополнительных функций. А так и с функцией mid неплохо работает.



--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0582 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.