Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
18 / 13 / 5
Регистрация: 08.01.2016
Сообщений: 315

Найдите ошибки

10.01.2016, 17:13. Показов 2004. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Народ, я для собственного саморазвития начал изучать VB (сказали самый легкий язык)... А вообще я юрист))) Изучаю недавно.
Дошел до изучения массивов и манипуляций с файлами. Написал код, который делит файл на три части, а потом собирает его обратно. Код, вроде бы рабочий. Проверял на файлах различных расширений. НО! Я хочу научиться программировать, хотя бы на средняковом уровне, учитывая, что я учусь сам, поэтому прошу Вас помочь мне найти ошибки в коде, подсказать как его писать правильнее, или указать на то, что в коде лишнее и ни в коем случае так делать нельзя и желательно объяснить почему. Спасибо больше заранее, парни.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
Dim myFile As String
Dim moiMASSIV() As Byte
Dim massivread1() As Byte
Dim massivread2() As Byte
Dim massivread3() As Byte
Dim odnatret As Long
Dim ID As Long
 
 
Private Sub Command1_Click()
myFile = "c:\iskomi.jpg"
    Open myFile For Binary As #1
    odnatret = Int(LOF(1) / 3)
    ReDim moiMASSIV(1 To LOF(1))
        For i = 1 To LOF(1)
            Get #1, i, moiMASSIV(i)
        Next i
 
 
    
    Open "c:\1.txt" For Binary As #2
        For q = 1 To odnatret
            If q <= odnatret Then
                Put #2, q, moiMASSIV(q)
            Else: Exit For
            End If
        Next q
    Close #2
    
   
    
    Open "c:\2.txt" For Binary As #3
        For q = q To (odnatret * 2)
             If q <= (odnatret * 2) Then
                Put #3, (q - odnatret), moiMASSIV(q)
            Else: Exit For
            End If
        Next q
    Close #3
    
 
    
    Open "c:\3.txt" For Binary As #4
        For q = q To LOF(1)
            ID = ID + 1
             If q <= LOF(1) Then
                Put #4, ID, moiMASSIV(q)
            Else: Exit For
            End If
        Next q
    Close #4
    
        Close #1
  ID = 0
  i = 0
 
End Sub
 
Private Sub Command2_Click()
    Open "c:\1.txt" For Binary As #1
    Open "c:\2.txt" For Binary As #2
    Open "c:\3.txt" For Binary As #3
    Open "c:\new.jpg" For Binary As #4
    ReDim massivread1(1 To LOF(1))
    ReDim massivread2(1 To LOF(2))
    ReDim massivread3(1 To LOF(3))
        For i = 1 To LOF(1)
            Get #1, i, massivread1(i)
            Get #2, i, massivread2(i)
            Get #3, i, massivread3(i)
        Next i
        Put #4, , massivread1
        Put #4, , massivread2
        Put #4, , massivread3
    Close #1
    Close #2
    Close #3
    Close #4
 
End Sub
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.01.2016, 17:13
Ответы с готовыми решениями:

Программа шашки. Реализация ходов. Оцените программу, найдите ошибки
Здравствуйте! Я начинающий программист, прошу оценить программу. Программа представляет собой реализацию ходов игры шашки. Я хочу...

Найдите ошибки
#pragma argsused #include &lt;iostream&gt; using namespace std; int _tmain(int argc, _TCHAR* argv){ double x = 2.7, // y = 1.83, // ...

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

33
18 / 13 / 5
Регистрация: 08.01.2016
Сообщений: 315
12.01.2016, 17:51  [ТС]
Студворк — интернет-сервис помощи студентам
Спасибо) это точно)
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
12.01.2016, 18:06
Между прочем польза от моей проги очень огромная, это я могу теперь не переживать об ограничениях, даже на здешнем форуме есть ограничения по размеру 10 мб для архивов
и по одному мб для прочего, я могу разбить 400 мб архив на 40 частей, и залить на какойнибудь форум, про киберфорум промолчу
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38169 / 21104 / 4307
Регистрация: 12.02.2012
Сообщений: 34,693
Записей в блоге: 14
12.01.2016, 19:03
Цитата Сообщение от fever brain Посмотреть сообщение
Между прочем польза от моей проги очень огромная, это я могу теперь не переживать об ограничениях, даже на здешнем форуме есть ограничения по размеру 10 мб для архивов
- не стоит преувеличивать... Почти все архиваторы могут строить многотомные архивы с заданным размером одного тома.
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
12.01.2016, 20:50
Первая программа для резки файлов на части, которую я видел, была программа LONG для DOS
Вот нашел - 36 кб
http://old-dos.ru/index.php?pa... how&id=495

Добавлено через 3 минуты
Хотя вот есть FileSplitter для Win - 21 кб http://www.softportal.com/soft... itter.html
2
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
12.01.2016, 22:04
Цитата Сообщение от Казанский Посмотреть сообщение
Хотя вот есть FileSplitter для Win - 21 кб
Оба-на!
Чем меряемся?
Мной написанный Сплиттер "весит" 10 Кб и поддерживает "Drag-And-Drop".
И что самое важное, разделяет на части с заданным размером.
Согласитесь неудобно разбивать на Х частей, если файл большой, то надо считать, сколько будет "весить" каждая часть.
Цитата Сообщение от fever brain Посмотреть сообщение
Между прочем польза от моей проги очень огромная
Прога хорошая, я плюсанул, но только медленная. Пытался разбить киношку 1.4 Гига на 10 частей, умучился ждать, но самое неприятное, что виснет интерфейс во время работы, а это косяк! Окошко должно быть видимым, рабочим и должна быть кнопочка отмены. В общем в потоке отдельном надо делать такие ресурсоёмкие операции.
1
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
12.01.2016, 22:20
Цитата Сообщение от Pro_grammer Посмотреть сообщение
В общем в потоке отдельном надо делать такие ресурсоёмкие операции.
Можно просто юзать асинхронную запись.
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
13.01.2016, 05:53
Сделал пару исправлений
1. это некорректное условие удаления файлов
было
If ch1.Value > 0 And ch1.Enabled = 1 Then
стало
If ch1.Value > 0 And ch1.Enabled = True Then

Раньше я думал что выражения ch1.Enabled = 1 и ch1.Enabled = True одинаковые оказываеться нет ))

2. Исправил отображение пустой папки (на картинке исправленное отображение)
Миниатюры
Найдите ошибки  
Вложения
Тип файла: rar Разбиение файлов.rar (162.9 Кб, 109 просмотров)
0
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
13.01.2016, 07:19
Цитата Сообщение от Pro_grammer Посмотреть сообщение
но только медленная. Пытался разбить киношку 1.4 Гига на 10 частей, умучился ждать
С большими файлами любая программа будет тормозить, это еще зависит от конкретной машины
а вот чтоб интерфейс не вис, придёться тогда разделить программу на 2 приложения, первое будет управлять вторым в котором будет чтение-запись, но я не претендую на милионное тиражирование, поэтому не буду ничего менять, в качестве учебного пособия вполне сойдёт
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
13.01.2016, 13:10
Цитата Сообщение от fever brain Посмотреть сообщение
придёться тогда разделить программу на 2 приложения
Не обязательно. Стандартная многопоточность VB6 при помощи использования объектов (ActiveX DLL). Работает "с коробки".
И Win API наше всё, работает с некоторыми неудобствами ( отладка в IDE не работает), посмотри работы у The trick, очень хорошо написано.
1
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
13.01.2016, 14:53
Асинхронная запись будет работать в IDE, просто нужно заполнять структуру OVERLAPPED.
1
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
13.01.2016, 15:57
Ну хорошо, буду знать, воспользуюсь когда буду делать чтото грандиозное
и где потребуется ворочать большие объёмы данных
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
13.01.2016, 21:49
Цитата Сообщение от Elkatib Посмотреть сообщение
прошу Вас помочь мне найти ошибки в коде, подсказать как его писать правильнее, или указать на то, что в коде лишнее и ни в коем случае так делать нельзя и желательно объяснить почему.
Хорошо. Если действительно решили подучится. Тогда, грубая критика. Кое что - мое личное мнение.

Строки 1-7. Переменные объявлены вне модуля. Значит они будут глобальными в пределах всего модуля.
Кликните здесь для просмотра всего текста

Аргументы против:
1. Общая область видимости между Вашими 2 модулями здесь не нужна.
2. Это плохая практика в принципе.
3. Не будет высвобождаться память после заполнения массивов.
Решение:
Объявить нужные переменные внутри каждой подпрограммы.


Отступы правильнее так (на примере Вашего кода:
Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub Command1_Click()
 
    myFile = "c:\iskomi.jpg"
 
    Open myFile For Binary As #1
    odnatret = Int(LOF(1) / 3)
    ReDim moiMASSIV(1 To LOF(1))
    For i = 1 To LOF(1)
        Get #1, i, moiMASSIV(i)
    Next i


Названия переменных можно было и более информативней сделать (прим. moiMASSIV - о назначении массива ничего не говорит.). Сугубо личное мнение. Сам грешу.

Visual Basic
1
odnatret = Int(LOF(1) / 3)
Деление на 3 с отбрасыванием дробной части равносильна операции целочисленного деления:
Visual Basic
1
odnatret = LOF(1) \ 3)
О статических идентификаторах для файлов (As #1) уже говорили.
Оправдано только для маленькой программы. В более крупной можете сами себя запутать дважды открыв файл, используя тот же ID (или ошибочно предполагать, что он уже свободен).
См. код Catstail как правильно.

Visual Basic
1
2
3
Open "c:\2.txt" For Binary As #3
'...
Open "c:\3.txt" For Binary As #4
Еще 2 потенциальные проблемы:
1) Для OS Vista и выше, по умолчанию, права доступа на запись в корень сис. диска заблокированы для пользователей группы "Администратор" и ниже, если не запускать программы "С повышенными привилегиями".
Т.к. в коде у Вас не используется обработчик ошибок, программа закроется с не очень информативным сообщением об ошибке.

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

Visual Basic
1
For q = q To (odnatret * 2)
Тут сразу несколько замечаний:
1) Неявное использование начального значения:
Если по какой-то причине предыдущее значение q будет установлено неверно, получим нарушение логики.
2) Нельзя сразу оценить каким будет начальное значение до тех пор, пока (в Вашем случае) не завершиться предыдущий цикл.
Интервалы байтов для разделения файлов лучше рассчитать заранее.
3) Плохой тон использование для инициализации цикла той же переменной, что управляется циклом.
К слову, как и изменение вручную этой переменной внутри цикла (просто пример).

Visual Basic
1
ReDim moiMASSIV(1 To LOF(1))
О рекомендованной нижней границе уже говорили. Добавлю только что, если попадется файл с размером 0 байт,
в этой точке кода получите ошибку. В идеале конечно проверять размер файла.

Visual Basic
1
2
For q = 1 To odnatret
  If q <= odnatret Then
Условие не имеет смысла. Оно всегда будет истинным, если ветвь исполнения дойдет до него.
И дальше по коду побайтовое чтение через цикл. Как Вы уже (наверное) поняли по выложенным примерам, нет смысла, т.к. можно считать целиком в массив нужное кол-во байт.

Visual Basic
1
Next i
i можно опустить, хоть и плохой тон. Переменную полезно явно указывать чаще всего, если много вложенных друг в друга циклов или когда очень длинный код заключен в цикл.

Visual Basic
1
Open "c:\1.txt"
Явное указание пути и имени. Плохой тон. Лучше указать переменную, которую вывести вместе с с похожими на видное место, где их можно легко изменить за один раз.

Visual Basic
1
2
3
4
 ID = 0
  i = 0
 
End Sub
Если переменная ID была бы локальной, то не имеет смысла, т.к. она уничтожается вместе с завершением подпрограммы.
Не вижу объявления переменной i в коде. По всей видимости - забыта.
Чтобы этого избежать, всегда пишите (особенно для новичков) первой строкой кода директиву:
Visual Basic
1
Option Explicit
это запретит использование необъявленных переменных и предупредит опечатки при их повторном написании.
Visual Basic
1
2
3
4
    Close #1
* * Close #2
* * Close #3
* * Close #4
Можно закрыть одновременно все открытые - командой:
Visual Basic
1
Close
Но не суть.
Visual Basic
1
2
3
4
5
Private Sub Command2_Click()
    Open "c:\1.txt" For Binary As #1
    Open "c:\2.txt" For Binary As #2
    Open "c:\3.txt" For Binary As #3
    Open "c:\new.jpg" For Binary As #4
Как и в прошлой процедуре - нет обработчика ошибок. Что если файл не существует или будет отказано в доступе?
С обработчиком будет примерно так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub Command2_Click()
    On Error Goto ErrorHandler
    Open "c:\1.txt" For Binary As #1
    Open "c:\2.txt" For Binary As #2
    Open "c:\3.txt" For Binary As #3
    Open "c:\new.jpg" For Binary As #4
    '...
    exit sub
ErrorHandler:
    msgbox "Произошла ошибка в функции: " & "Command2_Click(). #" & err.number & " - " & err.description & ". LastDllError = " & err.LastDllError
Цитата Сообщение от fever brain Посмотреть сообщение
Visual Basic
1
2
3
4
5
Private Function ReadBytes(FileName$, Optional ByRef Start&, Optional ByVal dln&) As Byte()
* * 'Чтение байт из файла
 * *'Арг: Путь // Старт // Длина по умолчанию всего файла
 * *'Возврат: Массив байт и следующая позиция чтения
 * *Dim n, f: On Error Resume Next
Обработчик установлен в режим безусловного игнорирования ошибок. Плохой тон.
Может привести к неконтролируемым / неявным ошибкам, зацикливаниям, вылету программы.
Как правильно, написал выше.
Опять же, пример так себе. Нет проверок на размер файла, нет модификатора доступа.
В коде для записи из поста № 2 кроме того, основной функционал игнорирует аргумент "Start".
2
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
15.01.2016, 09:39
Одно дело разговоры разговаривать, и совсем другое написать реальную программу
чтобы работала так, как хочет Pro_grammer

Теперь программа отображает прогрес-бар в ходе работы, и есть эта пресловутая кнопка отмены
более того, когда её жмёшь, отменяются все изменения которые уже были сделанны в папке
Теперь уже файл не частями делиться, а килобайтами.

тоесть 1 килобайт это 1024 байт если кому интересно.
естественно если файл меньше, то кнопка *разделить* будет неактивной
также, если предположительное количество частей больше 50,
то включится окно с предупреждением, а надо ли вам это ? ...



Сначала я хотел сделать с помощью API, но позже когда уже запутался в коде
и в конец измотал себя переделками, решил сделать двумя приложениями

Вот только форма:
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
Option Explicit
Option Compare Text
'
'Программа для разделения и сборки файлов
'© by the Fever Brain 2016
'
Const OneKB& = 1024, MyName = "DivBuild", IOF = MyName & ".io"
Const r& = 90, gen$ = "prt", stic$ = "cut.ico", jpg = "W.jpg", sl$ = "", t$ = ".", s1$ = "(", s2$ = ")"
 
Dim WithEvents cbx1 As ComboBox, WithEvents cbx2 As ComboBox
Dim WithEvents cm1 As CommandButton, WithEvents cm2 As CommandButton
Dim WithEvents ch1 As CheckBox, WithEvents ch2 As CheckBox
Dim WithEvents cm3 As CommandButton, WithEvents ch3 As CheckBox
Dim WithEvents cm4 As CommandButton, WithEvents t1 As Timer
 
Dim im As Image
Dim l1 As Label, l2 As Label
Dim pbxRrg As PictureBox, cm5 As CommandButton
Dim m_hMod&, fldr$, oldD$, sz&, ll&, tt&, w&, hh&, i&, v, cmd$
Dim mfso As Object, mshapp As Object
 
Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
Private Declare Sub InitCommonControls Lib "comctl32.dll" ()
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
 
Sub ObjEnabled(ByVal Exp As Boolean, ParamArray Obj())
    On Error Resume Next
    For Each v In Obj: v.Enabled = Exp: Next
End Sub
 
Sub ProgresActivate(Action As Boolean, Optional ButtonCommand$)
    On Error Resume Next
    If Action Then
        cmd = ButtonCommand
        ObjEnabled 0, Controls(cmd), cbx1, cm1
        cbx2.AddItem cbx2.Text, 0
        cm4.Enabled = 1
        With cm5 'В исходное положение
            .Move 0, 0, r, r * 3 - 45
            .Visible = 1
        End With
        pbxRrg.BackColor = vbWindowBackground
        t1.Interval = 100
    Else
        t1.Interval = 0
        cm4.Enabled = 0
        ObjEnabled 1, Controls(cmd), cbx1, cm1
        cm5.Visible = 0
        pbxRrg.BackColor = vbButtonFace
        Kill IOF
    End If
End Sub
 
Private Sub cm4_Click()
    On Error Resume Next
    DoEvents
    fso.CreateTextFile(IOF).Write "Cancel"
End Sub
 
Private Sub t1_Timer()
    On Error GoTo t1_Timer_Err
    Static s$, b As Boolean, j$(), i&, u&
    With fso
        If .FileExists(IOF) Then
            s = .OpenTextFile(IOF).ReadAll
            Select Case s
            Case "Cancel": ProgresActivate 0 'В режиме отмены
                Select Case cmd
                Case "cm2" 'Удаление начатого сборочного файла
                    j = Split(cbx1.Text, s2): u = UBound(j)
                    If j(u) = t & gen Then
                        ReDim Preserve j(u - 1)
                        s = Join(j, s2): j = Split(s, s1): u = UBound(j)
                        If IsNumeric(j(u)) Then ReDim Preserve j(u - 1): s = Join(j, s1)
                        If .FileExists(s) Then .DeleteFile s, 1
                    End If
                Case "cm3" 'Удаление уже созданных частей
                    For i = 1 To .GetFolder(fldr).Files.Count
                        s = cbx1.Text & s1 & i & s2 & t & gen
                        If .FileExists(s) Then .DeleteFile s, 1
                    Next
                End Select
                fldrRef
            Case "No File": ProgresActivate 0
            Case "End": ProgresActivate 0
                Select Case cmd
                Case "cm2"
                    s = Left(cbx1.Text, InStr(1, cbx1.Text, s1) - 1)
                    If Len(s) > 0 And Len(s) < Len(cbx1.Text) Then cbx1.Text = s
                Case "cm3"
                    s = cbx1.Text & s1 & 1 & s2 & t & gen
                    If fso.FileExists(s) Then cbx1.Text = s
                End Select
                fldrRef
                If ch3.Value > 0 Then PlaySound "Windows Vista Notify.wav", 0, &H1 Or &H20000
            Case Else: j = Split(s)
                If j(0) = "part" Then cm5.Width = pbxRrg.Width / CDbl(j(3) / j(1))
            End Select
        End If
    End With
    Exit Sub
t1_Timer_Err:
End Sub
 
Private Sub cm3_Click() 'Разделение
    Dim del&, s$, Part&, os&, b() As Byte, i&, n&
    Part = cbx2.Text * OneKB
    del = sz \ Part
    If del = 0 Then Exit Sub
    os = sz Mod del
    If del > 50 Then
        If MsgBox("На выходе получиться " & _
            del + Sgn(os) & " частей," & vbLf & _
            "Вы согласны ?", 68, "Внимание") = vbNo Then Exit Sub
    End If
    '=====================
    ProgresActivate 1, "cm3"
    Shell "DivBuild1.exe " & _
            "/Filename=" & cbx1.Text & _
            "/Part=" & Part & _
            "/DelParent=" & Abs(ch1.Value > 0 And ch1.Enabled = True)
    '=====================
End Sub
 
Private Sub cm2_Click() 'Сборка
    Dim ss$
    '=====================
    ProgresActivate 1, "cm2"
    Shell "DivBuild1.exe " & _
            "/Filename=" & cbx1.Text & _
            "/Build=" & 1 & _
            "/DelParts=" & Abs(ch2.Value > 0 And ch2.Enabled = True)
    '====================
    
End Sub
 
Private Sub cbx1_Click()
 
 
    Dim ge As Boolean, fe As Boolean, sys As Boolean, bdel As Boolean
    On Error Resume Next
    With fso
        fe = .FileExists(cbx1.Text)
        ge = .GetExtensionName(cbx1.Text) = gen
        With .GetFile(cbx1.Text)
            sys = .Attributes And 4 'Если системный
            sz = .Size
            bdel = sz \ cbx2.Text * OneKB > 0
        End With
        cm2.Enabled = fe And ge
        cm3.Enabled = fe And (Not cm2.Enabled) And bdel
        cbx2.Enabled = Not (cm2.Enabled)
        ch1.Enabled = fe And (Not ge) And (Not sys)
        ch2.Enabled = fe And ge
        cbx1.ToolTipText = "Файл: " & .GetAbsolutePathName(cbx1.Text) & " .. Размер: " & sz
        cbx2.ToolTipText = "Максимальное значение " & sz \ OneKB & " кб."
    End With
End Sub
 
Private Sub cbx2_Change()
    With cbx2
        If Not IsNumeric(.Text) Then .Text = 0: .SelStart = 0: .SelLength = 255
    End With
    cbx1_Click
End Sub
 
Private Sub cbx2_KeyPress(KeyAscii As Integer)
    Select Case KeyAscii
    Case 8
    Case 48 To 57
    Case Else: KeyAscii = 0
    End Select
End Sub
 
Private Sub Form_Initialize()
    m_hMod = LoadLibrary("shell32.dll")
    InitCommonControls
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
    On Error Resume Next
    'Заходим в первоначальную папку, и сохраняем настройки
    ChDir oldD
    SaveSetting MyName, "Check", "1", ch1.Value
    SaveSetting MyName, "Check", "2", ch2.Value
    SaveSetting MyName, "Check", "3", ch3.Value
    FreeLibrary m_hMod
End Sub
 
Private Sub Form_Resize()
    With Me
        If .WindowState = 1 Then Exit Sub
        .WindowState = 0
        .Width = cm4.Left + cm4.Width + (Me.Width - Me.ScaleWidth) + r * 2
        .Height = cm4.Top + cm4.Height + (Me.Height - Me.ScaleHeight) + r * 2
    End With
End Sub
 
Private Sub cm1_Click()
    On Error GoTo cm1_Click_Err
    sz = 0: cbx1.ToolTipText = ""
    fldr = shapp.BrowseForFolder(0, "Текущая, установленная  папка " & vbLf & fldr, 100, "").self.Path
    fldrRef
    Exit Sub
cm1_Click_Err:
End Sub
 
 
Sub fldrRef()
    'Обновление папки
    Dim v, s$
    ChDir fldr
    s = cbx1.Text
    With fso.GetFolder(fldr)
        cbx1.Clear
        For Each v In .Files
            cbx1.AddItem v.Name
        Next
        If fso.FileExists(s) Then cbx1.Text = s: cbx1_Click Else cbx1.ListIndex = 0
    End With
End Sub
 
Private Property Get shapp() As Object
    If mshapp Is Nothing Then Set mshapp = CreateObject("Shell.Application")
    Set shapp = mshapp
End Property
 
Private Property Get fso() As Object
    If mfso Is Nothing Then Set mfso = CreateObject("scripting.filesystemobject")
    Set fso = mfso
End Property
 
Private Sub cbx1_KeyPress(KeyAscii As Integer): KeyAscii = 0: End Sub
 
Private Sub Form_Load()
    ll = r: tt = r: w = r * 11: hh = r * 2
    oldD = CurDir$
    ChDir App.Path
    On Error Resume Next
    For Each v In Controls: v.Visible = 0: Next
    If fso.FileExists(jpg) Then
        Set im = Controls.Add("vb.image", "im")
        With im
            .Move ll, tt, w, r * 23
            .Stretch = 1
            .Picture = LoadPicture(jpg)
            .Visible = 1
        End With
        ll = ll + w + r
    End If
    Set l1 = Controls.Add("vb.Label", "l1")
    With l1
        .Move ll, tt, w, hh
        .Caption = "Файл:"
        .Visible = 1
    End With
    Set cbx1 = Controls.Add("vb.ComboBox", "cbx1")
    With cbx1
        .Move ll + l1.Width + r, tt, r * 29 ', hh
        .Visible = 1
    End With
    tt = tt + l1.Height + r * 2
    Set l2 = Controls.Add("vb.Label", "l2")
    With l2
        .Move ll, tt, w, hh
        .Caption = "Размер в кб:"
        .Visible = 1
    End With
    Set cbx2 = Controls.Add("vb.ComboBox", "cbx2")
    With cbx2
        .Move ll + l1.Width + r, tt, r * 29 ', hh
        .Text = 1
        .Visible = 1
    End With
    tt = tt + l2.Height + r * 2
    
    Set ch1 = Controls.Add("vb.CheckBox", "ch1")
    With ch1
        .Move ll, tt, r * 40, r * 3
        .Caption = "Удалить родительский файл"
        .Visible = 1
    End With
    tt = tt + l2.Height + r * 2
    Set ch2 = Controls.Add("vb.CheckBox", "ch2")
    With ch2
        .Move ll, tt, r * 40, r * 3
        .Caption = "Удалить части"
        .Visible = 1
    End With
    tt = tt + l2.Height + r * 2
    Set ch3 = Controls.Add("vb.CheckBox", "ch3")
    With ch3
        .Move ll, tt, r * 40, r * 3
        .Caption = "Звуки"
        .Visible = 1
    End With
    tt = tt + l2.Height + r * 2
    Set cm1 = Controls.Add("vb.CommandButton", "cm1")
    With cm1
        .Move ll, tt, r * 13, r * 3
        .Caption = "Папка .."
        .Visible = 1
    End With
    Set cm2 = Controls.Add("vb.CommandButton", "cm2")
    With cm2
        .Move ll + r * 14, tt, r * 13, r * 3
        .Caption = "Собрать"
        .Visible = 1
    End With
    Set cm3 = Controls.Add("vb.CommandButton", "cm3")
    With cm3
        .Move ll + r * 28, tt, r * 13, r * 3
        .Caption = "Разделить"
        .Visible = 1
    End With
    '--------
    ll = r: tt = tt + cm3.Height + r
    Set pbxRrg = Controls.Add("vb.PictureBox", "pbxRrg")
    With pbxRrg
        .Move ll, tt, r * 39, r * 3: ll = ll + .Width + r
        .Enabled = 0
        .Visible = 1
    End With
    Set cm4 = Controls.Add("vb.CommandButton", "cm4")
    With cm4
        .Move ll, tt, r * 13, r * 3
        .Enabled = 0
        .Caption = "Отмена"
        .Visible = 1
    End With
    Set cm5 = Controls.Add("vb.CommandButton", "cm5", pbxRrg)
    With cm5
        .Visible = 0
    End With
    Set t1 = Controls.Add("vb.timer", "t1")
    '--------------
    ch1.Value = GetSetting(MyName, "Check", "1", 0)
    ch2.Value = GetSetting(MyName, "Check", "2", 0)
    ch3.Value = GetSetting(MyName, "Check", "3", 1)
    fldr = App.Path
    fldrRef
    cbx1_Click
    With Me
        .Icon = LoadPicture(stic)
        .Caption = "Разделитель файлов"
        .Left = (Screen.Width - (.Left + .Width)) / 2
        .Top = (Screen.Height - (.Top + .Height)) / 2
    End With
End Sub




как я и говорил, в одной программе интерфейс, а в другой чтение-запись
работает всё корректно, проверил наверное 100 раз.
обмен между приложениями идёт через файлик с одной строчкой
общаются примерно так ..
-Ready
-Ok
-Part 1 of 1049
-Part 2 of 1049
' ' '
-End

при считывании можно подсмотреть в дебагере, но у меня собственноручно
динамически-создаваемый прогрэс-бар



Теперь для работы с большими файлами необязательно морочить себе голову WinApi
можно предворительно разделять на читабельные части, и делать что хош
Вложения
Тип файла: rar Разделитель файлов.rar (112.0 Кб, 2 просмотров)
2
oh my god
 Аватар для fever brain
1456 / 796 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
17.01.2016, 11:31
Некоторые может подумают а нафига этому человеку это нужно ..
-Ну тоже, какбы не хочется отставать от постоянных жителей форума

к томуже, сейчас я особенно ничем не заморочен и честно признаюсь, скучаю по программированию когда долго этим не занимаюсь, всегда узнаю чтото новое именно в процессе творчества, казалось бы что тут особенного но встречаются вещи которые либо совсем не решаемые, либо их решает какойнибудь корпоративный монстр наподобии майкрософта.
И темболее интересно попытаться решить очевидную загадку, а всяких загадок в программировании много, попадаются и такие, которые наверное можно решить только через сто лет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.01.2016, 11:31
Помогаю со студенческими работами здесь

Найдите ошибки
#include &lt;iostream.h&gt; class B{ int b; public: void setb() {cin&gt;&gt;b;} }; class C : private B{ int c; public: void setc()...

найдите ошибки
(defun task (x) (mapcar #'(lambda (x) (- x 1)) x)) ==&gt; task (task '(1 2 3 -1 -2 -3)) ==&gt; (0 1 2 -2 -3 -4) ...

Найдите ошибки
#include &lt;stdio.h&gt; void main() { printf(&quot;Vvod distancii v km\n&quot;,s); scanf(&quot;%f&quot;,&amp;s); printf(&quot;Vvod vrema v sec\n&quot;,t); ...

Найдите ошибки!
Вот мой код создания экрана на OpenGL GLUT. #if !defined(WIN32) #define APIENTRY #define CALLBACK #endif #ifdef __APPLE__ ...

Найдите ошибки
class ABC{ int a=3; int b; int c; public: ABC(int n=1) {b=n;} mul() {c=1+a*b;} };


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru